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

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


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

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2011/08/12 22:19:38
  • 終了:2011/08/13 20:36:43

ベストアンサー

id:nattow No.2

nattow回答回数102ベストアンサー獲得回数272011/08/12 22:57:59

ポイント295pt

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

id:tsunet

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

勉強になりました。

2011/08/13 20:37:37

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/08/12 22:28:35

ポイント5pt

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で 重複レコードを ひとつにできます。

id:tsunet

NULLで抽出されますが、未購入と購入済みの混在した複数レコードが出てしまうので、どうしたらよいかと困っていました。もう1つの回答で解決したので、終了とします。ありがとうございました。

2011/08/13 20:39:36
id:nattow No.2

nattow回答回数102ベストアンサー獲得回数272011/08/12 22:57:59ここでベストアンサー

ポイント295pt

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

id:tsunet

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

勉強になりました。

2011/08/13 20:37:37

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません