teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

MySQL

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

Q&A

1回答

451閲覧

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

kawagg

総合スコア1

MySQL Workbench

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

MySQL

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

0グッド

0クリップ

投稿2022/07/12 01:56

0

0

MySQL(8.0.23)で取引テーブル(sample)から、指定商品の組合せを含む取引ID(t_id)のユニーク数カウントを試みています。

以前、こちらの質問をさせていただき、一つのアイテムの組み合わせ条件については解決していますが、「同アイテムを含む複数の組み合わせ条件」を個別でカウントする方法を探しています。

・取引テーブル(sample)

t_iddtl_iditem_iditem_namequantity
11111apple1
12222orange1
21111apple1
22333peach1
31222orange1
32333peach1
33444grape1
41222orange4
42333peach4
43444grape1

・カウント条件の組み合わせ
セットA: orangeとpeach
セットB: orangeとpeachとgrape

とした場合、
セットAのt_idカウント: 3 (t_id=4の3件)
セットBのt_idカウント: 2 (t_id=3と4の2件)
で集計するイメージです。

仮にセットAのみのカウントの場合は前回いただいた質問回答より、

SQL

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

のように出せるかと思いますが、上記のようにセットが複数の条件且つ一つのt_id内で併売される場合に、上記クエリに何か追記で算出すべきか、もしくは別の方法を検討すべきかをご教示いただきたいです。

※セットAとBの例で、AはBからgrapeを抜いたもののため、WHERE句にgrape除外を加えれば・・とも思いましたが、併売(一つのt_id内でAとBの両方を含む取引)があることを考慮すると成立しないと分かり模索中です。

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

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

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

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

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

guest

回答1

0

やりかたはいろいろありそうですが、たとえばUNIONを利用するのはどうでしょうか?

SQL

1 SELECT "セットA", COUNT(*) 2 FROM ( 3 SELECT t_id 4 FROM sample 5 WHERE item_id IN (222, 333) 6 GROUP BY t_id 7 HAVING COUNT(*) = 2 8 ) X 9UNION ALL 10 SELECT "セットB", COUNT(*) 11 FROM ( 12 SELECT t_id 13 FROM sample 14 WHERE item_id IN (222, 333, 444) 15 GROUP BY t_id 16 HAVING COUNT(*) = 3 17 ) X

投稿2022/07/12 05:13

neko_the_shadow

総合スコア2395

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

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

kawagg

2022/07/12 05:37

前回に引き続き、ご回答をいただきありがとうございます。 今回と前回で異なる点が"quantity"カラムの存在で、ここへアイテム数量が入っている部分でして、 > セットAのt_idカウント: 3 (t_id=4の3件) > セットBのt_idカウント: 2 (t_id=3と4の2件) とカウントしたいのですが、上記クエリのようにUNIONで実行する場合、セットA:2件、セットB:2件でのカウントになってしまうところで行き詰っております・・。
neko_the_shadow

2022/07/12 07:14

・t_id=4の取引は、セットAを3個、セットBを1個取引したという認識で正しいですか? ・t_id=4の取引は、セットAを4個、grapeを1個取引したとも取れますが、それは考慮しなくてよいですか?
kawagg

2022/07/12 08:14

ご確認をいただきまして、ありがとうございます。 >・t_id=4の取引は、セットAを3個、セットBを1個取引したという認識で正しいですか? >・t_id=4の取引は、セットAを4個、grapeを1個取引したとも取れますが、それは考慮しなくてよいですか? t_id=4について、セットAを3個とセットBを1個、の取引としてカウントする形としたいと考えています。 ご指摘の通りで、パターンとしては セットAを4個とgrapeを1個 とも取る余地がありますが、1セット内アイテム数が多い組み合わせの一致判定が優先されるような形でのカウントを想定しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問