質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

855閲覧

グループ内の上位 N 件を抽出する SQL (件数がN件より少ないグループもある)

chacopanman

総合スコア23

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/04/13 12:02

MySQLについてです。

+----+----------+---------------------+
| id | category | updated_at |
+----+----------+---------------------+
| 1 | 1 | 2018-04-10 18:34:50 |
| 2 | 1 | 2018-04-10 18:35:54 |
| 3 | 1 | 2018-04-10 18:49:04 |
| 4 | 2 | 2018-04-10 19:01:58 |
| 5 | 2 | 2018-04-10 19:18:00 |
| 6 | 2 | 2018-04-12 16:45:35 |
| 7 | 2 | 2018-04-12 16:48:53 |
| 8 | 2 | 2018-04-12 17:05:15 |
| 9 | 2 | 2018-04-12 17:27:15 |
| 10 | 3 | 2018-04-12 17:27:50 |
| 11 | 2 | 2018-04-12 17:27:56 |
+----+----------+---------------------+

上記のようなテーブルに対して、
group 内、直近2件ずつ取得したい場合、どのようなSQLになるでしょうか。
updated_at には重複はない想定です。
いろいろ検索しましたが、以下のクエリだと、グループ内の件数が少ないものが取得できませんでした。

sql

1SELECT * 2 FROM hoge T1 3 WHERE (SELECT COUNT(*) 4 FROM hoge T2 5 WHERE T2.category = T1.category 6 AND T2.updated_at >= T1.updated_at 7 ) < 3 8 ORDER BY category,updated_at DESC

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一行ずつcountして連番付ける方法もあるけどlikeでやる。美しくない。

sql

1select * 2from hoge as T1 3where concat(',',substring_index(( 4 select group_concat(T2.id order by updated_at desc) 5 from hoge as T2 6 where T2.category=T1.category),',',2),',') like concat('%,',T1.id,',%') 7ORDER BY category,updated_at DESC

#追記
count方式はここにあったhttps://teratail.com/questions/23111

投稿2018/04/13 14:01

編集2018/04/13 14:04
sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chacopanman

2018/04/16 02:13

素早い回答ありがとうございます!こちらの返信が遅くなり失礼しました。。。 頂いたクエリで期待している結果出せました! ただレコード数が多くなってきたときのパフォーマンスが気になってきましたので、そもそものテーブル設計や実装の方も見直してみます。。。 group_concatなど、便利な関数を知ることができとてもためになりました! count方式は貼っていただいたQA含めいくつか見かけました。最低レコード数?が決まっている場合、有効な手段として、覚えておきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問