MySQLでgroup byの結果を逆順(最大順、最新順)で取得する方法

MySQLのgroup byで少しハマったのでメモしておきます。

結論からいうと、この問題を解決するには以下のSQL文でいけます。

SELECT * FROM table_name WHERE created IN (SELECT MAX(created) FROM table_name GROUP BY table_id)

MySQLで普通にgroup byして結果を取得すると、そのままではレコードの作成が古いものが優先されて取得されてしまいます。

それならば!ということでorder byして取得しようとしますが、group byはorder byより先に実行されてしまうらしく、order byしてもgroup byの結果が並び替えられるだけでうまくいきません。

なのでサブクエリを使って、group byで上記の例でいうところのcreated(datetimeと思ってください)の各最大レコードをMAXで取得して、あとはその取得結果に該当するするレコードを更に取得すれば良いというわけです。

いくつか方法を試してみましたが、特にサブクエリの実行速度を気にしないのであればこれが一番単純な解決法かと思います。

ページの先頭へ