MySQL では GROUP BY
の使用を拡張しています。GROUP
BY
部分にないカラムや計算を
SELECT
式で使用することができます。これは、そのグループの使用可能なあらゆる値を表します。この機能により、不要項目に対するソートやグループ化を行わないことで、パフォーマンスを向上させることができます。たとえば、次のクエリの場合、customer.name
をグループ化する必要はありません。
mysql>SELECT order.custid,customer.name,MAX(payments)
->FROM order,customer
->WHERE order.custid = customer.custid
->GROUP BY order.custid;
標準 SQL では、customer.name
を
GROUP BY
節に組み込む必要があります。MySQL では、非
ANSI
モードでの実行時にはこのカラム名は不要です。
GROUP BY
部分から取り除くカラムがグループ内で一意なものではない場合は、この機能を使用しないでください。予測不可能な結果になります。
場合によっては、MIN()
と
MAX()
を使用することによって、一意なものでないカラムの値を取り出すことができます。次の例では、sort
カラムの値が最も小さいレコードの
column
値が得られます。
SUBSTR(MIN(CONCAT(RPAD(sort,6,' '),column)),7)
See 項3.6.4. 「特定のフィールドのグループごとの最大値が格納されているレコード」。
注意: MySQL バージョン
3.22(またはこれより前のバージョン)を使用している場合や、SQL-99
に従う必要がある場合、GROUP BY
節と ORDER BY
節では式は使用できません。この制約は式のエイリアスを使用することによって回避できます。
mysql>SELECT id,FLOOR(value/100) AS val FROM tbl_name
->GROUP BY id,val ORDER BY val;
MySQL バージョン 3.23 では、次のようにします。
mysql> SELECT id,FLOOR(value/100) FROM tbl_name ORDER BY RAND();
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.