22
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

mysqlのGROUP BYでグループ化した中で最新のレコードを取得する

Last updated at Posted at 2017-05-20

GROUP BY区で括った中で最新のレコードを取得する場合を想定しています。

例えば、ユーザーがどのページを閲覧したかを記録するuser_page_logsテーブルがあるとします。

  • user_page_logsテーブル
スクリーンショット 2017-05-20 19.53.43.png
  • user_page_logs内データ
スクリーンショット 2017-05-20 20.23.09.png

指定したユーザーのページごとの閲覧時間(created)の最新が知りたいとします。

パッと思いつくSQLは以下のようなものでした。

SELECT * FROM user_page_logs WHERE user_id = 111 GROUP BY page_id ORDER BY created DESC;

上記の実行結果は以下のようになります。
スクリーンショット 2017-05-20 20.09.55.png

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 
);
スクリーンショット 2017-05-20 20.17.27.png
22
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?