• ベストアンサー

同一テーブルの同一フィールドで複数条件指定

例を挙げます。 テーブル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個から数十個とかの検索もありえます。 何かいい手はないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
noname#86752
noname#86752
回答No.1

できますよ。 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のアイテムを持っている人を抽出しているはずです。 ところでカラム名に.って使えますか?

moon_night
質問者

お礼

できましたー。 ありがとうございます。 テーブルもカンマ(,)で区切って複数指定できるんですね。知りませんでした。 フィールドで使えるのは知っていましたが。 ちなみにカラム名に . は使えないと思います。 分かりやすくするために例のような形式にしました。

その他の回答 (2)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.3

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

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

確認事項:各テーブルの中身 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を使う事になる。

moon_night
質問者

お礼

具体的な例を挙げての回答ありがとうございました。 やりたいことは 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が出てきますし、問題が解決しました。

関連するQ&A