• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MySQLで特定のグループの上位3件を取得したい。)

MySQLで特定のグループの上位3件を取得する方法

このQ&Aのポイント
  • MySQLで特定のグループの上位3件を取得する方法について教えてください。条件として、userでグループ化し、日付の降順で並べ、userごとに最新の3件のデータを取得したいです。
  • MySQLで特定のグループの上位3件を取得する方法について教えてください。userでグループ化し、日付の降順で並べ、userごとに最新の3件のデータを取得するためのSQL文を教えてください。
  • MySQLで特定のグループの上位3件を取得する方法について教えてください。userでグループ化し、日付の降順で並べ、最新の3件のデータを取得するためのSQL文を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

#1です。少し訂正が有ります。 複数の user の最新の日付が同じ場合に、それらのuserのデータが混ざって出力される可能性が有るので、ORDER BY句に user も含めるべきでした。 SELECT * FROM tbl_hoge a WHERE (SELECT COUNT(*) FROM tbl_hoge b WHERE a.user = b.user AND a.date < b.date) < 3 ORDER BY (SELECT MAX(date) FROM tbl_hoge c WHERE a.user = c.user) DESC, user, date DESC ;

ok-rjak
質問者

お礼

ありがとうございました! 希望通りの抽出が行えました。 実際のSQL文はもう少し複雑なのですが、提示して頂いた例を参考にアレンジさせて頂きました。 まだまだ勉強中の身ですので、またお世話になる際はよろしくお願いします。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>3.userのデータが複数あっても、取得するのは新しいものから3件のみ まで考えるとidも比較しなくてはいけないかもしれないですね select * from テーブル as t1 where (select count(*) from テーブル as t2 where t1.user=t2.user and (t1.date<t2.date or t1.date=t2.date and t1.id<t2.id) ) <3 order by (select max(`date`) from テーブル as t3 where t1.user=t3.user) desc ,user ,`date` desc

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

http://note.chiebukuro.yahoo.co.jp/detail/n181988 参考にしてください。 CNT列はグルーピングごとにカウントアップするのでこれをWHERE条件で絞ればいいかなと思います。

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

下記の様なSQLで出来るかと。 version 5.5.8 で確認しました。 SELECT * FROM tbl_hoge a WHERE (SELECT COUNT(*) FROM tbl_hoge b WHERE a.user = b.user AND a.date < b.date) < 3 ORDER BY (SELECT MAX(date) FROM tbl_hoge c WHERE a.user = c.user) DESC, date DESC > 1.userでグループ化したうちの日付降順で並べる user 単位では最新の日付の降順になるということですよね? ORDER BY句の自己結合で同じuserの中で最新の日付を取得して実現しています。 > 2.そのuserのデータの中で、日付降順で並べる 同一の user のデータ同士も日付の降順になるということですよね? ORDER BY句の date DESC で実現しています。 > 3.userのデータが複数あっても、取得するのは新しいものから3件のみ WHERE句の自己結合で実現しています。 同じuserでそれより新しい日付のデータが3件未満という意味です。

参考URL:
http://codezine.jp/article/detail/460

関連するQ&A