多个IN()运算符 - 没有结果

时间:2011-09-02 15:11:44

标签: mysql sql

我有一个问题:

SELECT DISTINCT
countryName,countrySlug
FROM countries AS Country 
INNER JOIN countries_networks AS n ON Country.id = n.country_id
AND n.network_id IN (1,14)

工作正常。但是,我现在需要为它添加一个'must have'子句,这样n.network_id也必须在集合中(6,7,8,9)。 (顺便说一下,他们可以有多个network_ids,因为我直接从查找表中提取。)

所以我尝试添加另一个IN():

SELECT DISTINCT
    countryName,countrySlug
    FROM countries AS Country 
    INNER JOIN countries_networks AS n ON Country.id = n.country_id
    AND n.network_id IN (1,14)
AND n.network_id IN (6,7,8,9)

现在根本不会返回任何结果。

这似乎我在这里犯了一个愚蠢的错误。任何人都可以看到它是什么?感谢。

4 个答案:

答案 0 :(得分:2)

是;你要求network_id出现在两个不相交的列表中。给定值a不可能出现在以下两个列表中:

1, 14
6, 7, 8, 9

要击败死马,让我们看看每一个值

value  list1 list2
------------------
1      x
6            x
7            x
8            x
9            x
14     x

这是任何列表中的整个值集;超出该范围的任何内容都不适合 条件,并且范围内的任何值都不适合两个条件。

为了满足单个Country基于network_id关联表可以有多个country_network的条件,您可以执行以下操作:

select distinct
    c.countryname, c.countryslug

from country c

join country_network cn1 on cn1.country_id = c.country_id
join country_network cn2 on cn2.country_id = c.country_id

where cn1.network_id in (1, 14) and cn2.network_id in (6, 7, 8, 9)

答案 1 :(得分:2)

给定的network_id 不能同时在两个集合中。 (1,14)(6,7,8,9)

您可以通过自我加入来实现所需的结果。

... countries_networks cn1 
   join countries_networks cn2 on cn1.country_id = cn2.country_id
where cn1.network_id in (1,14) and cn2.network_id in (6,7,8,9)

答案 2 :(得分:2)

根据我上面的评论,请尝试以下操作:

SELECT DISTINCT countryName,countrySlug
FROM countries AS Country 
WHERE Country.id IN (SELECT n.country_id FROM countries_networks n WHERE n.network_id IN (1,14))
AND Country.id IN (SELECT n.country_id FROM countries_networks n WHERE n.network_id IN (6,7,8,9))

性能方面,两个子查询可能会受到影响,但根据表中的行数可能无关紧要。我将继续使用连接并更新...

<强>更新

使用双连接,这应该产生您需要的结果:

SELECT DISTINCT countryName,countrySlug
FROM countries AS Country
INNER JOIN countries_networks n1 ON n1.country_id = Country.id
INNER JOIN countries_networks n2 ON n2.country_id = Country.id
WHERE n1.network_id IN (1,14)
AND n2.network_id IN (6,7,8,9)

答案 3 :(得分:1)

IN ()是一系列OR的同义词

所以WHERE a IN (1,2,4)
也可以写成

WHERE (a = 1 OR a = 2 OR a = 4)  

您正在尝试:

WHERE ... a IN (1,14) AND a IN (6,7,8,9)

可以改写为

WHERE (a = 1 OR a = 14) AND (n.network_id = 6 OR ....)

别介意你在连接子句中这样做,不要在意我没有写出完整的等效代码。显然network_id 不能是两个不同的值同时,这就是为什么你的查询永远不会返回任何东西。