うめぼしジョイスティック - ivoice

CakePHP、JavaScript、jQuery等のプログラミングについて書いていきます 思考は、うめぼしのように硬く、そして柔らかく。

SQL文で子データのスコアを足して(SUM)、親のid + 子の合計 という形でデータを出力する方法

データベースで親のidが子とリレーションをしているとします。

具体的には、 『parents』 というデータベースと 『children_results』 というデータベースがあったとします。

親のデータは

id  parent_name

のようになっていて

children_resultsは、

id  parent_id  result_score  というカラム構成だとしましょう。

親 - 子 - 子 - 子

このような形で、親がいくつか子を持っているデータベースです。

ここで、子のデータにある『スコア』を全部足して、その合計値を  

親のid  スコアの合計

というカラムで表示する方法です。

SELECT parents.id, SUM(children_results.result_score) FROM children_results LEFT JOIN parents ON children_results.parent_id = parents.id WHERE children_results.parent_id = parents.id GROUP BY parents.id;


この一文で終了です。

SELECTで、何を表示するか選択をします。 ここでは parents.idと、result_scoreの和(SUM)です。 注意点は、SUMのあとのカッコは空白を空けないことです。 また、SELECTで表示するものの間にはカンマを忘れないようにしましょう。

FROMのあとは、どのデータベースから参照するかを決めています。ここでは children_results ですが、そのあとにLEFT JOINという文字が見えます。

LEFT JOINという命令で、親と子の2つのテーブルを繋いでいます。

ここでは、子のテーブルの右側に親のテーブルがいちいちくっついている、ようなイメージです。

LEFT JOINのあとのテーブル名が繋ぎたいテーブル。 ONのあとのイコール文で、どのid同士を繋ぎたいかを表します。この場合は親のidと、子が親を参照するためのidを繋いでいます。

その後に、どのデータをSUM(足し算)するかを WHEREで表しています。

この場合、【親のid】と【子の親を参照するためのid】が一致する行のスコアを足し算させています。

そのあとに、GROUP BYという命令を用いています。これは、GROUP BYのあとに指定されたid が グループ分けの際に用いられる分別表のような役割をします。

ここでは「parents.id」(親のid)をグループ分けに使うと宣言しています。

ですので、SELECTのあとの、表示するカラムに parents.id を指定すると、

【parents.id と 子のスコアの合計】

といった具合で、データがうまく表示されるのです。