2011-09-02 33 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 不能在同一時間是兩個不同的值,這就是爲什麼你的查詢從不返回任何東西。