2013-07-08 49 views
2

我有3个表:冠军,角色,champs_to_rolesWHERE子句需要多个值?

的champs_to_roles表看起来像这样:

|ID_champ|ID_role| 
---------------- 
|  2|  2| 
|  4|  5| 
|  5|  3| 
|  3|  2| 
|  1|  1| 
|  1|  2| 

我想选择的ID_champ WHERE ID_role = 1 AND ID_role = 2

在这一点上我有以下代码:

SELECT DISTINCT `c`.`name` 
FROM `champions` AS c, 
(
    SELECT `ID_champ` 
    FROM `champs_to_roles` 
    WHERE `ID_role` IN(1,2) 
) AS r 
WHERE `r`.`ID_champ` = `c`.`ID` 

然而,这会返回ID_champ,ID_role = 1或Id_role = 2或者他们都是

如何获取我需要的内容?

感谢很多:)

回答

4

使用两个内连接到关联表 - 每个角色类型:

SELECT c.name 
FROM champions c 
JOIN champs_to_roles ctr1 ON ctr1.ID_champ = c.id AND ctr1.ID_role = 1 
JOIN champs_to_roles ctr2 ON ctr2.ID_champ = c.id AND ctr2.ID_role = 2 

通过使用加入,排在champs_to_roles绝存在为冠军返回。

DISTINCT关键字用,因为你不需要它

+0

感谢解决我的问题。如果我必须增加所需值的数量,您的解决方案非常灵活;) –

0

我可能会与解决方案去(除非你在你的关联表,这似乎不太可能和一个不好的设计,如果甚至有可能有重复的条目)分配波希米亚,但出于完整性也有使用次数和检查从子查询

SELECT c.name 
FROM champions AS c 
INNER JOIN 
(
    SELECT ID_champ, COUNT(DISTINCT ID_role) AS NumRole 
    FROM champs_to_roles 
    WHERE ID_role IN(1,2) 
    GROUP BY ID_champ 
) AS r 
ON r.ID_champ = c.ID AND NumRole = 2 

返回角色的数量(这也可以没有再选择完成的可能性,但它是一个触摸不易阅读时你没有返回你需要分组的列,等等)

+0

@Bohemian,@Kickstart,感谢您的回答。这工作很好。我发现自己这个解决方案: 'SELECT DISTINCT c.name FROM冠军为C, \t( SELECT ID_champ \t FROM champs_to_roles \t WHERE ID_role IN(1,2) GROUP BY ID_champ HAVING COUNT(*) = 2 \t)AS r WHERE r.ID_champ = c.ID' –

+0

这样做,尽管我更喜欢使用当代连接语法。我使用了COUNT(DISTINCT ID_role),以防万一ID_role对冠军不是唯一的,但如果它是唯一的(即ID_champ和ID_role有唯一的覆盖索引),则可以使用COUNT(*)。但我更喜欢@Bohemian提出的方法 – Kickstart

0

你可以尝试这样的:

Select 
    c.name 
from 
    champions c 
where 
    exists(select 
      1 
     from 
      champs_to_roles ctr1 
     where 
      ctr1.ID_champ = c.ID 
       and exists(select 
        1 
       from 
        champs_to_roles ctr2 
       where 
        ctr2.ID_champ = ctr1.ID_champ 
         and ctr2.ID_role <> ctr1.ID_role)) 
0

试试这个,

SELECT DISTINCT c.name 
FROM champions AS c, 
(
    SELECT c1.ID_champ 
    FROM champs_to_roles c1, champs_to_roles c2 
    WHERE c1.ID_role=1 and c2.ID_role=2 
    AND c1.ID_champ=c2.ID_champ 
) AS r 
WHERE r.ID_champ = c.ID