人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLで質問です。
顧客テーブル user (id,name) と 履歴テーブル order (order_id,user_id,syouhin_id, ?) が存在します。
履歴テーブルには1行にsyouhin_id が1つしか登録されません。
(1回の取引で1つの注文のみです。)
ユーザーの購入履歴の処理で詰まっているのですが
Aという商品とBという商品を「両方」買ったユーザー の抽出方法がいまいち考えられません。

syouhin_id の or ではなく and になると思うのですが構造上そうではないですし(汗

宜しくお願い致します。

●質問者: inunekoneko
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● こばさん
●167ポイント ベストアンサー

select *
from user
where id in (select user_id from order where syouhin_id=A)
and id in (select user_id from order where syouhin_id=B)


inunekonekoさんのコメント
ありがとう御座います。 一番最初にご回答いただいたのでBAとさせて頂きます。 望んでいた動作が実現できました。

2 ● うぃんど
●167ポイント

簡単な記述で応用の効く例

SELECT a.*
FROM `user` a
WHERE EXISTS(SELECT * FROM `order` b WHERE b.user_id = a.id AND b.syouhin_id = A LIMIT 1)
 AND EXISTS(SELECT * FROM `order` b WHERE b.user_id = a.id AND b.syouhin_id = B LIMIT 1)
;

動作速度面で少し有利な例

SELECT a.*
FROM `user` a
 LEFT JOIN `order` b1 ON b1.user_id = a.id AND b1.syouhin_id = A
 LEFT JOIN `order` b2 ON b2.user_id = a.id AND b2.syouhin_id = B
WHERE b1.order_id IS NOT NULL
 AND b2.order_id IS NOT NULL
;

お暇な時に以下参照
http://dev.mysql.com/doc/refman/5.1/ja/optimizing-subqueries.html


inunekonekoさんのコメント
ありがとう御座います。 参考にさせていただきます。

3 ● oil999
●166ポイント
SELECT * FROM user
WHERE id in (SELECT user_id FROM ORDER WHERE syouhin_id=A)
AND id IN (SELECT user_id FROM ORDER WHERE syouhin_id=B);

inunekonekoさんのコメント
ありがとう御座います。 参考にさせていただきます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ