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

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

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

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

MySQL

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

Q&A

解決済

1回答

506閲覧

【MySQL】アイテムの組合せに一致する取引IDの個別件数カウント

kawagg

総合スコア1

MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

MySQL

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

0グッド

0クリップ

投稿2022/07/09 15:53

編集2022/07/09 17:26

MySQL(8.0.23)で取引テーブル(sample)から、指定商品の組合せを含む取引ID(t_id)のユニーク数カウントしようとしていますが、この場合の効率的なクエリ処理についてご教示いただきたいです。


・取引テーブル(sample)

t_iddtl_iditem_iditem_name
11111apple
12222orange
21111apple
22333peach
31222orange
32333peach
33444grape

orangeとpeachの組合せを含むt_idを抽出条件とし、これに該当するt_id個別件数を取得する方法として、

SQL

1/*sampleテーブルを横持ち変換*/ 2WITH a AS ( 3SELECT 4t_id, 5MAX(t_id) mx, 6MAX(CASE WHEN dtl_id=1 THEN item_id ELSE NULL END) AS item1, 7MAX(CASE WHEN dtl_id=2 THEN item_id ELSE NULL END) AS item2, 8MAX(CASE WHEN dtl_id=3 THEN item_id ELSE NULL END) AS item3 9FROM sample 10GROUP BY t_id) 11 12/*カウント*/ 13SELECT 14COUNT(*) 15FROM ( 16SELECT 17a.t_id, 18/*t_id毎の全itemを1カラム内で文字列結合*/ 19CASE WHEN a.mx = 1 THEN a.item1 20WHEN a.mx = 2 THEN CONCAT(a.item1, " ", a.item2) 21WHEN a.mx = 3 THEN CONCAT(a.item1, " ", a.item2, " ", a.item3) 22ELSE NULL END AS all_items 23FROM a) b 24WHERE b.all_items LIKE '%222%' 25AND b.all_items LIKE '%333%' 26GROUP BY b.t_id;

上記のsampleテーブルでは1取引当たり最大3アイテムですが、中には数十アイテム含まれる取引があり、その場合多行に渡るCASE文でクエリが長くなり処理量も増えるかと思います。

このようなケースでは、nアイテム分の行数を動的に処理する方法を検討するのが良いのか、または該当組み合わせの取引IDの個別カウントが目的であれば、上記のクエリとは何か別の考え方でカウント処理すべきなのか、アドバイスいただけましたら助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

たとえば以下のようなSQLはどうでしょうか。

SQL

1SELECT COUNT(*) 2FROM ( 3 SELECT t_id 4 FROM sample 5 WHERE item_id IN (333, 444) 6 GROUP BY t_id 7 HAVING COUNT(*) = 2 8) X

投稿2022/07/09 17:33

neko_the_shadow

総合スコア2230

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

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

kawagg

2022/07/10 02:06

ありがとうございます、ご提示のクエリで処理できることを確認しました。 とてもシンプルで分かりやすいクエリで、参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問