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 と 子のスコアの合計】
といった具合で、データがうまく表示されるのです。