多对多的关系和复杂的陈述

时间:2013-06-19 08:24:26

标签: mysql many-to-many

我有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

是否可以选择具有复杂表达式指定的相关[类型]的所有[怪物]?

1 个答案:

答案 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')