GROUP BY区で括った中で最新のレコードを取得する場合を想定しています。
例えば、ユーザーがどのページを閲覧したかを記録するuser_page_logs
テーブルがあるとします。
- user_page_logsテーブル
- user_page_logs内データ
指定したユーザーのページごとの閲覧時間(created)の最新が知りたいとします。
パッと思いつくSQLは以下のようなものでした。
SELECT * FROM user_page_logs WHERE user_id = 111 GROUP BY page_id ORDER BY created DESC;
page_idが1のグループは閲覧時間2017-05-20 20:00:00
のレコードが取得されてほしいのに、2017-05-03 10:00:00
のレコードが取得されてしまいます。
GROUP BYされた後にORDER BYされているようで、これでは期待する結果は得られません。
idはAUTOINCREMENTが前提ですが、以下のSQLで取得できました。
SELECT * FROM user_page_logs WHERE id IN(
SELECT MAX(id) FROM user_page_logs WHERE user_id = 111 GROUP BY page_id
);