Как сделать выбор, где х равен нескольким значениям? - PullRequest
54 голосов
/ 04 ноября 2008

Я отлаживаю некоторый код и обнаружил следующий SQL-запрос (упрощенная версия):

SELECT ads.*, location.county 
FROM ads
LEFT JOIN location ON location.county = ads.county_id
WHERE ads.published = 1 
AND ads.type = 13
AND ads.county_id = 2
OR ads.county_id = 5
OR ads.county_id = 7
OR ads.county_id = 9

Я получаю очень странные результаты запроса, и я думаю, что это потому, что первое ИЛИ отрицает операторы AND, которые были найдены перед ним.

Это приводит к получению результатов для объявлений всех типов, а не только для типа 13.

Каждый раз, когда вызывается запрос, может быть различное количество объектов округа, которые необходимо найти.

Буду признателен за любую помощь в правильном подходе.

Ответы [ 3 ]

117 голосов
/ 04 ноября 2008

Поставьте круглые скобки вокруг «ИЛИ»:

SELECT ads.*, location.county 
FROM ads
LEFT JOIN location ON location.county = ads.county_id
WHERE ads.published = 1 
AND ads.type = 13
AND
(
    ads.county_id = 2
    OR ads.county_id = 5
    OR ads.county_id = 7
    OR ads.county_id = 9
)

Или, что еще лучше, используйте IN:

SELECT ads.*, location.county 
FROM ads
LEFT JOIN location ON location.county = ads.county_id
WHERE ads.published = 1 
AND ads.type = 13
AND ads.county_id IN (2, 5, 7, 9)
19 голосов
/ 04 ноября 2008

Вы можете попробовать использовать круглые скобки вокруг выражений ИЛИ, чтобы убедиться, что ваш запрос интерпретирован правильно, или, если говорить более кратко, используйте IN:

SELECT ads.*, location.county 
FROM ads
LEFT JOIN location ON location.county = ads.county_id
WHERE ads.published = 1 
AND ads.type = 13
AND ads.county_id IN (2,5,7,9)
13 голосов
/ 04 ноября 2008

И еще проще, используя IN:

SELECT ads.*, location.county 
  FROM ads
  LEFT JOIN location ON location.county = ads.county_id
  WHERE ads.published = 1 
        AND ads.type = 13
        AND ads.county_id IN (2,5,7,9)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...