我有3个表,它们在[怪物]和[类型]之间形成多对多的关系
monsters, monsters_types, types
我有以下怪物,每个怪物有几个相关[类型]
MONSTERS.name | TYPES.name
===============|===============
sharkthing | fish
sharkthing | human
|
werewolf | human
werewolf | wolf
werewolf | warrior
|
blob | ooze
|
thefly | insect
thefly | human
我想找到所有与“(狼或昆虫)和(人类)”类型有关系的怪物,所以我希望得到那个表达
MONSTERS.name
===============
werewolf
thefly
这是我的查询:
SELECT monsters.name from monsters
JOIN monsters_types
ON monsters_types.monster_id = monster.id
JOIN types
ON types.id = monsters_types.type_id
WHERE (types.name = 'wolf' OR types.name = 'insect') AND types.name = 'human'
这不起作用,因为有一个AND运算符 type.name 字段不能同时是'human'和其他东西。
我已经研究过使用IN语句,但这对我来说效果不好,因为我根据传入的表达式动态构建查询。对于上表,示例url将是
www.example.com/listmonsters?type=(wolf|insect),human
是否可以选择具有复杂表达式指定的相关[类型]的所有[怪物]?
答案 0 :(得分:0)
尝试:
SELECT DISTINCT monsters.name
FROM monsters
JOIN monsters_types
ON monsters_types.monster_id = monster.id
WHERE EXISTS (SELECT *
FROM types
WHERE types.id = monsters_types.type_id
AND type.name IN ( 'wolf', 'insect' ))
AND EXISTS (SELECT *
FROM types
WHERE types.id = monsters_types.type_id
AND type.name = 'human')