ユーザーの購入履歴から、あるアイテムを持っていないユーザーを抽出したいのですが、良い方法はありますでしょうか?
情報が少ないですが一般的な構成で以下のようなテーブルがあったと仮定します。
例えばitem_idが123の商品を購入していないユーザを取得するなら↓こんなSQLでいいと思います。
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM history WHERE item_id=123);
このような形のSQLになります。
SELECT USER_NAME FROM BUYING_HISTORY WHERE NOT EXISTS (SELECT * FROM BUYING_HISTORY WHERE ITEM = '○○○○')
NOT EXISTSに続く副問い合わせの検索結果が行を返せばWHERE句の判定が偽になります。
以下はMYSQLのマニュアルの該当部分のリンクです。ご確認ください。
http://dev.mysql.com/doc/refman/5.1/ja/exists-and-not-exists-subqueries.html
一応家に帰って来ましたので書きますと、
2012/03/06 22:24:06ユーザテーブル(ユーザID,ユーザ名)ユーザの情報
購入履歴テーブル(連番,ユーザID,商品ID)購入履歴の情報
というテーブルがあった場合
SELECT
A.ユーザID
,A.ユーザ名
FROM
ユーザテーブル A
WHERE
NOT EXISTS (
SELECT
'x'
FROM
購入履歴テーブル B
WHERE
A.ユーザID = B.ユーザID
AND B.商品ID = 'ターゲットの商品ID'
)
ORDER BY
ユーザID ASC;
という感じで「ターゲットの商品ID」に対象の商品IDを入れると購入してないユーザが表示されます。