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

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1069795
で質問した続きです。
うっかり詳細のテストをしてないのに締め切ってしまいました。

テーブルA 「member」
| id | name |

テーブルB 「item」
| id | name |

テーブルC 「item_check」
| member_id | item_id |

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

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

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

select distinct a.id, a.name from member as a,item as b,item_check as c
where a.id = c.member_id and c.item_id = b.id
and (c.item_id = '2' or c.item_id = '3')


select member.*,item.name 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

で or 検索はできますが、
and 検索をすると 「Empty set」となってしまいます。
select distinct a.id, a.name from member as a,item as b,item_check as c
where a.id = c.member_id and c.item_id = b.id
and (c.item_id = '2' and c.item_id = '3')

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

A 回答 (2件)

こんにちは。



ごめんなさい、意味がわかりました・・・。
>>アイテムA と アイテムBを持っているメンバー
両方持ってるメンバーだけという事ですね?

まずはitem_checkのテーブルからmember_idだけを抽出します。
SELECT member_id, count(member_id)
FROM item_check
WHERE item_id = 'A' OR item_id = 'B'
GROUP BY member_id
HAVING count(member_id) > 1 --ここの数値は条件のアイテム数と合わせてね。

これでとりあえずmember_idが取れるので、
後は副問い合わせとかで引っ付けてください。
(^^ゞ

この回答への補足

質問文が分かりづらいようでした。すいません。

Mysql のバージョンが 4.0.21 の為副問い合わせが使えません。
たしか 4.1 からでしたよね。
ベータ版なのであえて避けて正式版の方を使っています。

そうなるとやっぱりクエリを分けなくてはいけないのですか?
一回で出るに越したことはありませんが。
(というか早いほうがいいのですが)

テストして検討をしてみます。

補足日時:2004/11/05 16:48
    • good
    • 0
この回答へのお礼

SELECT * FROM item_check,member,item WHERE member.id = member_id and item.id = item_check.item_id and (item_id = '2' OR item_id = '3') GROUP BY member.id HAVING count(member_id) >= 2

テストした結果、これで一発で出るようです。
ありがとうございました。

まだ知らないことってたくさんあるんですね。
MysqlのWEBマニュアルを見ても分かりづらいので・・・
周りにスペシャリストがいないので助かりました。

お礼日時:2004/11/05 17:31

こんにちは。



ご質問の意図が・・・よくわかりません。
一番最後に掲載されているSQLは変じゃないですか?
ORでいいかと思うのですが、なぜANDなんでしょう???
(^^ゞ

この回答への補足

なぜANDなのかは、どちらともを含む検索をさせたいのですが、この構文を投げると「Empty set」となる。
ということです。
(つまり、この構文はおかしいということですね)

補足日時:2004/11/05 16:44
    • good
    • 0

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