こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MySQLで特定のグループの上位3件を取得したい。

ちょっと壁に当たったので、わかる範囲でお答え頂きたいのですが、
以下のようなテーブルがあったとします。

id user price date
1 A 1000 2013/5/31
2 A 1200 2013/6/1
3 B 1000 2013/5/20
4 A 1500 2013/5/12
5 C 1300 2013/5/31
6 C 1400 2013/5/14
7 C 1000 2013/5/6
8 B 1100 2013/5/24
9 B 1200 2013/5/30
10 B 1100 2013/5/4
11 A 1800 2013/4/12
12 C 900 2013/4/6
・・・

次に取得したいのは、

A 1200 2013/6/1
A 1000 2013/5/31
A 1500 2013/5/12
C 1300 2013/5/31
C 1400 2013/5/14
C 1000 2013/5/6
B 1200 2013/5/30
B 1100 2013/5/24
B 1000 2013/5/20

このようなデータなのですが、
条件:
1.userでグループ化したうちの日付降順で並べる
2.そのuserのデータの中で、日付降順で並べる
3.userのデータが複数あっても、取得するのは新しいものから3件のみ

この条件を満たすSQL文はどのように記述すればよいか、お知恵をお貸し下さい。
よろしくお願いします。

投稿日時 - 2013-06-01 13:56:15

QNo.8114683

困ってます

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

#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
;

投稿日時 - 2013-06-01 21:34:19

お礼

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

投稿日時 - 2013-06-03 14:03:30

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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

投稿日時 - 2013-06-03 09:59:02

ANo.3

http://note.chiebukuro.yahoo.co.jp/detail/n181988

参考にしてください。
CNT列はグルーピングごとにカウントアップするのでこれをWHERE条件で絞ればいいかなと思います。

投稿日時 - 2013-06-02 02:39:03

ANo.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

投稿日時 - 2013-06-01 21:23:03

あなたにオススメの質問