- 締切済み
商品Aと商品Bを購入したユーザーの取得
こんにちは! 現在以下の状態でのsql作成に悩んでいます。 テーブルユーザー uid name 1 test1 2 test2 3 test3 購入履歴 id uid item 1 1 商品A 2 1 商品B 3 2 商品B 4 3 商品A 5 3 商品C の様なテーブルから商品Aと商品Bを購入した ユーザーのみを抽出したいと考えています。 恥ずかしながら見当も付かない状態です。 ポインタだけでも結構ですので ご教示頂けますようよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- cool_koo1976
- ベストアンサー率50% (40/79)
#2です。 ごめんなさい。結合条件が抜けてました。 SQLを訂正します。 SELECT テーブルユーザー.uid, テーブルユーザー.name FROM テーブルユーザー, 購入履歴 AS Hist_A, 購入履歴 AS Hist_B WHERE テーブルユーザー.uid = Hist_A.uid AND テーブルユーザー.uid = Hist_B.uid AND Hist_A.item = '商品A' AND Hist_B.item = '商品B';
- cool_koo1976
- ベストアンサー率50% (40/79)
こんばんは。 テーブル別名を使って、SQL上「購入履歴」テーブルを2つ用意し、 一方で"商品A"を持つレコードを、もう一方で"商品B"を持つレコードを検索すれば 目的の結果を抽出できると思います。 【例】 SELECT DISTINCT テーブルユーザー.uid, テーブルユーザー.name FROM テーブルユーザー, 購入履歴 AS Hist_A, 購入履歴 AS Hist_B WHERE Hist_A.item = '商品A' AND Hist_B.item = '商品B';
- syntax-error
- ベストアンサー率71% (5/7)
試していませんが、 SELECT DISTINCT ユーザ.id,ユーザ.name FROM ユーザ LEFT JOIN ON (ユーザ.id = 購入履歴.uid) WHERE 購入履歴.item = '商品A' OR 購入履歴.item = '商品B'; でしょうか?
補足
申し訳ありません。説明不足でした。 商品Aと商品B両方を購入しているユーザーのIDを 取得したいのでORではなくANDで検索したいのですが、、 何卒、よろしくお願いいたします。
お礼
回答ありがとうございます。 投稿した後自分なりにも考えてみたのですが SELECT UID FROM 購入履歴 WHERE 商品名 in ('商品A', '商品B') having count(*) = 2 と言うのを考えてみましたが この方法ですと、商品Aを2度購入したユーザーも 拾えてしまい、要件を満たしませんでした 確かに、今回回答いただいた方法で 商品A、商品B等限定的であれば 一番有効そうではありますが マッチさせたい商品が多くなると検索に 時間がかかりそうでもあります。 とは言え、今回取得したい内容には 十分すぎる回答で、参考になります。 大変ありがとうございます。