- ベストアンサー
同一テーブルの同一フィールドで複数条件指定
例を挙げます。 テーブル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個から数十個とかの検索もありえます。 何かいい手はないでしょうか。
- みんなの回答 (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のアイテムを持っている人を抽出しているはずです。 ところでカラム名に.って使えますか?
その他の回答 (2)
- anmochi
- ベストアンサー率65% (1332/2045)
#2です。 ごめん。間違った。置き換えれるのは、「item.id=1 and item.id=3」じゃなくて「item.id=1 or item.id=3」だった。 andをorに直してくらはい。
- anmochi
- ベストアンサー率65% (1332/2045)
確認事項:各テーブルの中身 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を使う事になる。
お礼
具体的な例を挙げての回答ありがとうございました。 やりたいことは 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が出てきますし、問題が解決しました。
お礼
できましたー。 ありがとうございます。 テーブルもカンマ(,)で区切って複数指定できるんですね。知りませんでした。 フィールドで使えるのは知っていましたが。 ちなみにカラム名に . は使えないと思います。 分かりやすくするために例のような形式にしました。