2011-09-02 31 views
1

我有一个查询:多张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) 

工作正常。不过,我现在需要给它添加一个'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

你的构造方式说'network_id'必须等于(1或14)和(6或7或8或9)这是不可能的... –

回答

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可以具有基于country_network关联表多network_id S,你可以这样做:

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) 
+0

感谢您的解释;) –

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

基于我的评论上面,请尝试以下操作:

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)) 

明智的性能,有可能是由两个子查询一击,但根据中行的数量,可能是无关紧要你的桌子。我会去使用连接和更新...

UPDATE

使用双重加入,这应该得到你所需要的结果:

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) 
+0

工作了一种享受,谢谢一堆! –

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 不能在同一时间是两个不同的值,这就是为什么你的查询从不返回任何东西。