Несколько операторов IN () - Нет результатов - PullRequest
1 голос
/ 02 сентября 2011

У меня есть запрос:

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)

, который работает нормально.Однако теперь мне нужно добавить к нему предложение «должен иметь», так что n.network_id ДОЛЖЕН также быть в наборе (6,7,8,9).(Кстати, они могут иметь несколько идентификаторов network_id, так как я извлекаю данные непосредственно из таблицы поиска.)

Поэтому я попытался добавить еще один 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 ]

2 голосов
/ 02 сентября 2011

Да.

Заданная 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 голосов
/ 02 сентября 2011

Исходя из моего комментария выше, попробуйте следующее:

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)
2 голосов
/ 02 сентября 2011

Да; вам требуется, чтобы 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 s на основе таблицы ассоциации 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 голос
/ 02 сентября 2011

IN () является синонимом для серии ИЛИ

Так что 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 не может быть двумя разными значениями одновременно, поэтому ваш запрос никогда ничего не возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...