アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは!

現在以下の状態での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を購入した
ユーザーのみを抽出したいと考えています。
恥ずかしながら見当も付かない状態です。
ポインタだけでも結構ですので
ご教示頂けますようよろしくお願いいたします。

A 回答 (3件)

試していませんが、



SELECT DISTINCT ユーザ.id,ユーザ.name
FROM ユーザ
LEFT JOIN ON (ユーザ.id = 購入履歴.uid)
WHERE 購入履歴.item = '商品A' OR 購入履歴.item = '商品B';

でしょうか?

この回答への補足

申し訳ありません。説明不足でした。

商品Aと商品B両方を購入しているユーザーのIDを
取得したいのでORではなくANDで検索したいのですが、、
何卒、よろしくお願いいたします。

補足日時:2005/04/11 18:23
    • good
    • 0

こんばんは。



テーブル別名を使って、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';
    • good
    • 0

#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';
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

投稿した後自分なりにも考えてみたのですが
SELECT UID FROM 購入履歴
WHERE 商品名 in ('商品A', '商品B')
having count(*) = 2

と言うのを考えてみましたが
この方法ですと、商品Aを2度購入したユーザーも
拾えてしまい、要件を満たしませんでした

確かに、今回回答いただいた方法で
商品A、商品B等限定的であれば
一番有効そうではありますが
マッチさせたい商品が多くなると検索に
時間がかかりそうでもあります。

とは言え、今回取得したい内容には
十分すぎる回答で、参考になります。

大変ありがとうございます。

お礼日時:2005/04/12 00:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す