MySQL5.7使用です。
GROUP_CONCAT
を書くとWHERE
で存在しない条件なのに、レコードがNULL
で取得されてしまう仕様を知りました。
解決策としてGROUP BY
とHAVING
があるようですが、どちらを使えばいいのでしょうか?
またその理由を教えて頂けませんでしょうか?
今回は以下の例としての質問ですが、「他にこういう例ならこっちがいい」なども知りたいです。
テーブル例
MySQL
1CREATE TABLE persons ( 2 ID INT AUTO_INCREMENT PRIMARY KEY 3 ,age INT 4 ); 5 6INSERT INTO persons(age) values (50),(20),(71),(33),(18); 7 8CREATE TABLE children ( 9 person_ID INT 10 ,person_ID2 INT 11 ); 12 13INSERT INTO children(person_ID,person_ID2) values (1,2),(1,5),(3,4);
GROUP BY による方法
MySQL
1SELECT p.ID 2 ,GROUP_CONCAT(c.person_ID2) AS children_ids 3 4FROM persons p 5 LEFT JOIN children c ON c.person_ID = p.ID 6 7WHERE p.age > 100 8 9GROUP BY p.ID
HAVING による方法
MySQL
1SELECT p.ID 2 ,GROUP_CONCAT(c.person_ID2) AS children_ids 3 4FROM persons p 5 LEFT JOIN children c ON c.person_ID = p.ID 6 7WHERE p.age > 100 8 9HAVING children_ids IS NOT NULL
###追記
HAVING
ではWHERE
が存在するときの取得がおかしかったです。
次のようにWHERE p.age > 1
とすると、ID=1 の子供は 2,5 だけなのに、2,5,4 が取得できてしまいました。
MySQL
1SELECT p.ID 2 ,GROUP_CONCAT(c.person_ID2) AS children_ids 3 4FROM persons p 5 LEFT JOIN children c ON c.person_ID = p.ID 6 7WHERE p.age > 1 8 9HAVING children_ids IS NOT NULL 10
そうなると新たな疑問です。
こちらの質問で、ランキング上位の方がGROUP BY
ではなくHAVING
を提案されているのですが、これは間違ったご回答になるのでしょうか?
しかし的確なご回答ばかりされている方なので、とても間違いだとは思えません。
HAVING
が良い理由を知りたいです。
回答3件
あなたの回答
tips
プレビュー