MySQLのGROUP BYは特殊

今再構築している販売管理システムの現行のコードに、どう見ても実行不可能なSQLが埋まっていた。

SELECT * FROM 受注
INNER JOIN 受注オプション ON 受注.受注ID=受注オプション.受注ID
GROUP BY 受注.受注ID

受注オプションというのは、商品に手提げ袋を添付するとか、メッセージカードを付けるといった情報を収容するテーブルで、受注1件に対して0〜N件のレコードが存在する。

上記のSQLは、「オプションが存在する受注を一覧する」ためのもの。
GROUP BY 受注IDを付加することで、INNER JOINにより受注オプションの件数になった結果表を、受注の件数に絞り込んでいるつもりらしい。
GROUP BYに指定していないカラムをSELECTしてしまったら、SQLのパースが通らないはずだが...と思ってMySQLのマニュアルをチェックすると、MySQLの独自拡張により、SELECTする対象の列をGROUP BY句に指定しなくてもよいことが判明。
http://dev.mysql.com/doc/refman/4.1/ja/group-by-hidden-fields.html

GROUP BY 部分にないカラムや計算を SELECT 式で使用することができます。
この機能により、不要項目に対するソートやグループ化を行わないことで、
パフォーマンスを向上させることができます。

ただし

GROUP BY 部分から取り除くカラムがグループ内で一意なものではない場合は、
この機能を使用しないでください。予測不可能な結果になります。

とある。問題のSQLでは、GROUP BYの結果、1件の受注に対してN件ある受注オプションのどのレコードが残されるのか気になるが、実行結果を見ると、最初にひっかかった1件を選択しているようだ。