2008-11-04 6 views
44

Tak więc ", debugowanie niektórych kodu i istnieje następujące zapytanie SQL (uproszczone z tego, co naprawdę jest).Jak wybrać, gdzie x jest równe wielu wartościom?

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 

Dostaję bardzo dziwne wyniki kwerendy i myślę, że dlatego, że pierwszy lub neguje i „S, które są przed nim. Dostaję więc wyniki z powrotem dla reklam wszystkich typów, a nie tylko typu 13. Za każdym razem, gdy wywoływane jest zapytanie, może być wiele hrabstw, które wymagają wyszukiwania lub tylko kilku.

Każda pomoc w poprawnym wykonaniu tego byłoby mile widziana.

Odpowiedz

98

Put nawiasy wokół „lub” S:

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 
) 

Albo jeszcze lepiej, korzystać 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) 
+7

Myślę, że wersja IN jest łatwiejsza do odczytania i rzadziej zwraca nieoczekiwane wyniki. – DOK

+4

jest również *** znacznie *** szybszy, przynajmniej na MySQL – warren

+1

W moim przypadku wartości w 'IN' pochodzą z wyniku innego zapytania, jak sobie z tym poradzić? –

17

Można spróbować użyć nawiasów wokół lub wyrażenia, aby upewnić się, że zapytanie jest interpretowany poprawnie lub bardziej zwięźle, Zastosowanie w:

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

a nawet prostsze przy użyciu 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) 
Powiązane problemy