Q&A

回答の並べ替え:
投稿新規に質問を投稿する

MySQL の GROUP BY おそるべし

車さくら 車さくら

2019-10-07 10:03

こんにちは。
みなさん、MySQLのGROUP BYにしてやられたことはありませんか?

SQLタブでGROUP BY句に無い項目をSELECT句に書いてもエラーにならないんですね。MySQLを調べてみたら、これがなんと仕様だとのこと。CELFの問題ではないのですが。。

以下はMySQLのページからの抜粋です。
-------------------------------------------
標準 SQL では、GROUP BY 句を含むクエリーは、GROUP BY 句で名前が指定されていない選択リスト内の非集約カラムを参照できません。たとえば、このクエリーは、選択リスト内の name カラムが GROUP BY に表示されていないため、標準 SQL では不正です。

SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid;1234

このクエリーを正当にするには、name カラムを選択リストから削除するか、GROUPBY 句で名前を指定する必要があります。

MySQL では、選択リストが GROUP BY 句で名前が指定されていない非集約カラムを参照できないように、GROUPBY の使用が拡張されています。つまり、上記のクエリーは MySQL では正当です。

MySQL GROUP BY の拡張を無効にするには、ONLY_FULL_GROUP_BYSQL モードを有効にします。これにより、標準 SQL の動作が有効になります。GROUPBY 句で名前が指定されていないカラムは、集約関数で囲まなければ、選択リストまたは HAVING 句で使用できません。
-----------------------------------------------

MySQL以外のRDBの経験がある方は気を付けた方が良いですね。あと、経験が浅い人が知らずにSQL書くと恐ろしい結果が待ち受けています。
本投稿が何かのお役に立てば幸いです。

最初のコメント投稿者になりましょう。