GROUP BY で指定したカラムの値が、同じ値の行はグループ化されるが、GROUP BY で指定していないカラムの値は、どの行の値を優先させるか、通常は決めることができない。
例えば、下記のようなSQLだと、得られるidの優先順位は指定できない。(実際、昇順で最初のものがくる場合が多いが、保証はされない)
1 2 3 4 |
SELECT id, name, birthday FROM `tbl` GROUP BY birthday WHERE birthday > '1999/12/31' |
この場合は、副問い合わせで対応するのが一般的なやり方らしい。
1 2 3 4 5 6 7 8 |
SELECT id, name, birthday FROM `tbl` WHERE id IN( SELECT MAX(id) -- idで最大の値を取得 FROM `tbl` GROUP BY birthday WHERE birthday > '1999/12/31' ) |
ちなみにWHERE句で絞る場合も、副問い合わせの中で絞らないとダメ。なので、下記の場合は失敗する。
1 2 3 4 5 6 7 8 |
SELECT id, name, birthday FROM `tbl` WHERE id IN( SELECT MAX(id) -- idで最大の値を取得 FROM `tbl` GROUP BY birthday ) AND birthday > '1999/12/31' |
参考サイト)