MySQL(8.0.23)で取引テーブル(sample)から、指定商品の組合せを含む取引ID(t_id)のユニーク数カウントしようとしていますが、この場合の効率的なクエリ処理についてご教示いただきたいです。
・取引テーブル(sample)
t_id | dtl_id | item_id | item_name |
---|---|---|---|
1 | 1 | 111 | apple |
1 | 2 | 222 | orange |
2 | 1 | 111 | apple |
2 | 2 | 333 | peach |
3 | 1 | 222 | orange |
3 | 2 | 333 | peach |
3 | 3 | 444 | grape |
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の個別カウントが目的であれば、上記のクエリとは何か別の考え方でカウント処理すべきなのか、アドバイスいただけましたら助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/10 02:06