カラムをカウントして別のテーブルに連結させる -SQL-

データベースに格納されているデータを意図した形に表示したい場合はSQLを利用することが多いのだが、日頃SQLに触れていないと使い方を忘れたり発想が浮かばないので利用シーンに応じたSQLを紹介する。

今回のSQLの利用シーンは、複数のグループが存在し、それぞれのグループに属すメールアドレスの数をカウントするSQLだ。

DB構成としてはグループ情報を格納するテーブル"T_グループ"、メールアドレスを格納するテーブル"T_メール"があり、下記のようなデータが既に格納されているとする。


□T_グループ
group_idname
101AAAA
102BBBB
103CCCC



□T_メール
user_idgroup_idemail
1101a01@aaaa.aaaa
2101a02@aaaa.aaaa
3102b01@bbbb.bbbb
4101a03@aaaa.aaaa
5102b02@bbbb.bbbb



SQLの考え方としては、"T_グループ"をベースに"T_メール"を連結させる。
その際、"group_id"というカラムを利用する。

実際のSQLは下記となる。


SELECT T_グループ.*, COUNT(T_メール.group_id) AS cnt
FROM T_グループ LEFT JOIN T_メール ON
T_メール.group_id = T_グループ.group_id GROUP BY T_グループ.group_id, T_グループ.name;



□SQL実行の結果
group_idnamecnt
101AAAA3
102BBBB2
103CCCC0



"T_グループ"をベースにしているのでグループに属しているメールアドレスが無い場合はカウント値が"0"になる。

注意点として、このSQLではFROMより前の"T_グループ"の全てのカラムを表示するとしているため、「GROUP BY」で指定するカラムも全カラムを指定しておかなければ「ERROR: column "T_グループ" must appear in the GROUP BY clause or be used in an aggregate function」といったエラーが発生して実行されない。

対応策として、表示するカラム(FROMより前)とグルーピングするカラム(GROUP BYより後)を合わす必要がある。


ちなみに、"T_グループ"に特定に条件で抽出しソートする場合は、下記のようなSQLになる。

SELECT T_グループ.*, COUNT(T_メール.group_id) AS cnt
FROM T_グループ LEFT JOIN T_メール ON WHERE T_グループの条件文
T_メール.group_id = T_グループ.group_id GROUP BY T_グループ.group_id, T_グループ.name
ORDER BY T_グループのカラム ソート順;

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック