MYSQL5.0.77を使用しています。
3つのテーブルがあります。
products 商品情報
p_id pname price
1 商品1 1000
2 商品2 2000
3 商品3 3000
users ユーザー情報
u_id uname age
1 山田 12
2 田中 20
3 山中 30
histories 購入情報
m_id pid uid
1 1 3
2 1 2
3 2 3
4 2 1
これらの中から、例えば、ユーザー全員を表示した上で、商品1を購入したかどうかを出したいです。
u_id uname 購入?
1 山田 未購入
2 田中 購入済
3 山中 購入済
↑このような感じです。
SELECT users.* histories.* FROM users LEFT JOIN histories ON users.u_id=histories.uid
と書いてみましたが、これだと商品を絞り込んでいないため、未購入の情報は入ってきますが、1ユーザーが複数購入していると、同じユーザーが histories の行数だけでてきてしまいます。
WHERE histories.pid=1
と加えると、未購入のユーザーはでてきません。
どのように記述したらよいかご教授いただければ幸いです。
まず SQL を示します
select u.u_id, u.uname, case when h.uid is not null then '購入済' else '未購入' end from users u left outer join (select distinct uid from histories where pid = 1) h on u.u_id = h.uid
histories テーブルを、商品1を購入したuid だけを持つようにあらかじめ絞り込んでから outer join すると、購入済ならヒットし、未購入なら null になるので判別できるようになると思います
http://homepage1.nifty.com/rucio/main/VBdotNet/Database/Database10.htm
LEFT JOIN すれば 存在しない場合 NULLで抽出されるはずなんですけどね。
NULLだったら 未購入にすればいいだけです。
http://www.agtech.co.jp/html/v8manuals/sqlref/syntaxref24.html
複数レコード抽出された場合は DISTINCTで 重複レコードを ひとつにできます。
NULLで抽出されますが、未購入と購入済みの混在した複数レコードが出てしまうので、どうしたらよいかと困っていました。もう1つの回答で解決したので、終了とします。ありがとうございました。
まず SQL を示します
select u.u_id, u.uname, case when h.uid is not null then '購入済' else '未購入' end from users u left outer join (select distinct uid from histories where pid = 1) h on u.u_id = h.uid
histories テーブルを、商品1を購入したuid だけを持つようにあらかじめ絞り込んでから outer join すると、購入済ならヒットし、未購入なら null になるので判別できるようになると思います
ありがとうございます!できました。
勉強になりました。
ありがとうございます!できました。
勉強になりました。