GROUP BYしたときに件数が増えるという現象があったので一応メモ。というか当たり前のことですが・・・
たとえば以下のようなテーブルがあったとします。
student
id | student_name |
1 | ヤマダ |
2 | スズキ |
club
id | club_name |
100 | 野球 |
200 | サッカー |
300 | バスケ |
student_club
student_id | club_id |
1 | 100 |
1 | 200 |
2 | 200 |
2 | 300 |
所属しているクラブの情報を出すには以下のSQLで出せます。
1 2 3 4 5 6 7 8 9 |
select student_name ,club_name from stundent s join student_club sc on s.id = sc.student_id join club c on sc.club_id = c.id +---------------+-----------+ | stundent_name | club_name | +---------------+-----------+ | ヤマダ | 野球 | | ヤマダ | サッカー | | スズキ | サッカー | | スズキ | バスケ | +---------------+-----------+ |
ここで生徒のidでgroupbyすると当然生徒単位になります。
1 2 3 4 5 6 7 |
select student_name ,club_name from student s join student_club sc on s.id = sc.student_id join club c on sc.club_id = c.id group by s.id; +---------------+-----------+ | stundent_name | club_name | +---------------+-----------+ | ヤマダ | 野球 | | スズキ | サッカー | +---------------+-----------+ |
気を付けないといけいないのですが、クラブ名がでることです。このクラブ名は当然ただしくないので注意しましょう。
1 2 3 4 5 6 7 8 9 |
select student_name ,club_name from student s join student_club sc on s.id = sc.student_id join club c on sc.club_id = c.id group by s.id,c.id; +---------------+-----------+ | student_name | club_name | +---------------+-----------+ | ヤマダ | 野球 | | ヤマダ | サッカー | | スズキ | サッカー | | スズキ | バスケ | +---------------+-----------+ |
ここで、生徒とクラブごとにgroupbyすると件数が増えます。他のキーがあれば当然件数が増えます。
当たり前のことなんですが、データが多かったり、テーブル構造が複雑だったりすると発見に時間がかかることが多いです。