プロが教えるわが家の防犯対策術!

例を挙げます。

テーブルA 「member」
| ID | 名前 |

テーブルB 「item」
| ID | 名前 |

テーブルC 「item_check」
| member.ID | item.ID |

というテーブルがあります。

テーブルAはメンバーで一人一つのデータが入っています。
テーブルBはメンバーが持つであろうアイテムのマスタです。
テーブルCはメンバーがどのアイテムを持っているかを示しているテーブルです。
テーブルCに関しては同じメンバーでも複数のアイテムを持つこともあるので複数のデータが入る場合もあります。

で、やろうとしているのは、
「アイテムA と アイテムBを持っているメンバー」
という検索を行いたいのです。

同じテーブル上ならば
select * from member where item1 = "A" and item2 = 'B' ... ;
と、いくつでも条件が指定可能なのですが、
同じテーブルの同じフィールドを同じメンバーで複数条件指定して検索することはできるのでしょうか。

私が考えたのは一回ではできないで、
まずは一つの条件を出して
while でループさせて条件を付け足してやるような効率が悪そうなものです。
(少ない件数ならばいいのですが、数千~数万件の検索になりそうなので手軽にできればと思いまして・・・)

アイテムは不特定なので、1個から数十個とかの検索もありえます。

何かいい手はないでしょうか。

A 回答 (3件)

できますよ。


andというのは「AかつB」という条件ですが、orというのが「AまたばB」という条件を作れます。

select distinct a.id, a.名前 from member as a,item as b,item_check as c
where a.id = c.member.id and c.item.id = b.id
and (item_check.item.id = 'A' or item_check.item.id = 'B')

これでいかがでしょう?
item.idがAまたはBのアイテムを持っている人を抽出しているはずです。
ところでカラム名に.って使えますか?
    • good
    • 0
この回答へのお礼

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

テーブルもカンマ(,)で区切って複数指定できるんですね。知りませんでした。
フィールドで使えるのは知っていましたが。


ちなみにカラム名に . は使えないと思います。
分かりやすくするために例のような形式にしました。

お礼日時:2004/11/05 13:11

#2です。



ごめん。間違った。置き換えれるのは、「item.id=1 and item.id=3」じゃなくて「item.id=1 or item.id=3」だった。
andをorに直してくらはい。
    • good
    • 1

確認事項:各テーブルの中身


member
ID|名前
1|あんもち
2|ムーンライト

item
ID|名前
1|おにぎり
2|しゃけ
3|ゆでたまご

item_check
memberid|itemid
1|1
1|2
2|1
2|3

これでよいのかな? これを踏まえた上で↓。
------------
できるよ。

select member.*
from member, item, item_check
where member.id=item_check.memberid and item.id=item_check.itemid
and item.id in (1, 3)

これで普通にできると思うけどな。
一番下の行 item.id in (1, 3)のかっこの中を動的に変えれば良い。これは次のように置き換える事もできる。「item.id=1 and item.id=3」

ちなみに例に示したSQL文が返すのは
member.id|member.名前
1|あんもち
2|ムーンライト
2|ムーンライト

例えばこれで、「該当するアイテムを1個でも持っている人を1回のみ抽出」という事であれば、DBにもよるけどdistinctを使う事になる。
    • good
    • 0
この回答へのお礼

具体的な例を挙げての回答ありがとうございました。

やりたいことは or( in() ) ではなく、 and ですので、and で使用します。

select member.* from member, item, item_check
where member.id=item_check.member_id and
item.id=item_check.item_id and
item.id in (1, 3) group by member.id

と、group by を使用すれば 重複なしでmemberが出てきますし、問題が解決しました。

お礼日時:2004/11/05 13:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す