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

SQLの記述について教えてください。
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

と加えると、未購入のユーザーはでてきません。


どのように記述したらよいかご教授いただければ幸いです。

●質問者: tsunet
●カテゴリ:ウェブ制作
✍キーワード:12 AGE ON SELECT SQL
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ
●5ポイント

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つの回答で解決したので、終了とします。ありがとうございました。


2 ● nattow
●295ポイント ベストアンサー

まず 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 になるので判別できるようになると思います

◎質問者からの返答

ありがとうございます!できました。

勉強になりました。

関連質問


●質問をもっと探す●



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