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で一回で取得したいです。
どのようなクエリを書けば良いのか、ご教示いただきたいです。よろしくお願いします。
無茶苦茶いい問題ですね。
教科書の応用問題で出そう。
今、考えています。
たぶん、sqlで一発でいけますよ。
ちょっと今から予定があるので、
後で答え合わせしよう。
ありがとうございます。とても心強いお言葉...!
私も引き続き考えます。お忙しい中ありがとうございます。
MySQLのバージョンは何ですか?
テーブル定義やテーブル中のデータをCREATE TABLEとINSERTで https://teratail.com/help/question-tips#questionTips3-7 の [コード] に修正できた方が動作確認しやすいので適切なコメントが付き易いかと。
MySQL8.0ですと、Windows関数が使えます。https://hit.hateblo.jp/entry/MYSQL/8.0/WINDOW
mysql のバージョンは、 `5.7` です。
記載しておらず申し訳ありません。追記いたしました。
>Orlofsky様
ありがとうございます。
サンプルテーブル・レコードのクエリを追記させていただきました。
わたしは修正してください、と書きました。
無断に情報がダブるのは良くないです。
>Orlofsky様
大変失礼しました。おっしゃっている意味を考えて修正したのですが、認識合っていますでしょうか。。
違っていれば申し訳ありません。
回答1件
あなたの回答
tips
プレビュー