mysqlバージョン: v5.7
やりたいこと
sql
1 2# テーブル作成 3CREATE TABLE `trump` ( 4 `id` int(11) NOT NULL, 5 `card_type` varchar(40) NOT NULL COMMENT 'カード種別', 6 `created_at` datetime DEFAULT NULL COMMENT '作成日時' 7); 8 9# インサート 10INSERT INTO `trump` (`id`, `card_type`, `created_at`) VALUES 11 (1, "K", "2020-10-01 11:00:00"), 12 (1, "K", "2020-10-01 12:00:00"), 13 (1, "K", "2020-10-01 13:00:00"), 14 (1, "Q", "2020-10-01 13:00:00"), 15 (1, "Q", "2020-10-01 14:00:00"), 16 (2, "K", "2020-10-01 11:00:00"), 17 (2, "K", "2020-10-01 12:00:00"), 18 (2, "Q", "2020-10-01 11:00:00"), 19 (2, "Q", "2020-10-01 13:00:00"), 20 (3, "JOKER", "2020-10-01 11:00:00"), 21 (3, "JOKER", "2020-10-01 12:00:00"); 22 23# データ取得 24select * from trump; 25+----+-----------+---------------------+ 26| id | card_type | created_at | 27+----+-----------+---------------------+ 28| 1 | K | 2020-10-01 11:00:00 | 29| 1 | K | 2020-10-01 12:00:00 | 30| 1 | K | 2020-10-01 13:00:00 | 31| 1 | Q | 2020-10-01 13:00:00 | 32| 1 | Q | 2020-10-01 14:00:00 | 33| 2 | K | 2020-10-01 11:00:00 | 34| 2 | K | 2020-10-01 12:00:00 | 35| 2 | Q | 2020-10-01 11:00:00 | 36| 2 | Q | 2020-10-01 13:00:00 | 37| 3 | JOKER | 2020-10-01 11:00:00 | 38| 3 | JOKER | 2020-10-01 12:00:00 | 39+----+-----------+---------------------+
上記のようなテーブルがあるとします。
以下の条件に合ったデータを id
でグループ化して mysql
で取得したいと思っています。
■ 取得したい内容
1. id 2. 同一 id の中で 最も多い card_type 【エイリアス】 card_type_1 3. { 同一 id の中で 最も多い card_type } の中で 最新 の created_at 【エイリアス】 card_type_1 4. 同一 id の中で 2番目 に多い card_type 【エイリアス】 card_type_2 5. { 同一 id の中で 2番目 に多い card_type } の中で 最新 の created_at 【エイリアス】 card_type_2
※ 同率一位の場合、 created_at
で比較し、新しい方が 1位 とする。
■ 結果として欲しいレコード
結果としては以下のレコードが欲しいです。
id | card_type_1 | created_at_1 | card_type_2 | created_at_2 |
---|---|---|---|---|
1 | K | 2020-10-01 13:00:00 | Q | 2020-10-01 14:00:00 |
2 | Q | 2020-10-01 13:00:00 | K | 2020-10-01 12:00:00 |
3 | JOKER | 2020-10-01 12:00:00 | null | null |
いろいろ調べたり試してみたのですが、そもそもこれが実現できることなのかもわからず、困っています。
もし、一回で取得するのが難しければ、phpと処理を分けるつもりなのですが、
できればsqlで一回で取得したいです。
どのようなクエリを書けば良いのか、ご教示いただきたいです。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー