2008-11-04 29 views
44

所以我',調試一些代碼,並有以下的SQL查詢(從它真正的簡化)。如何做從x等於多個值的地方選擇?

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 

我從查詢中得到了很奇怪的結果,我認爲它是因爲第一個OR否定了AND之前的結果。因此,我將搜索結果反饋給所有類型的廣告,而不僅僅是類型13.每次查詢被調用時,可能會有許多縣需要查找,或者只有幾個縣。

任何幫助正確的方式去這個將不勝感激。

回答

98

圍繞「或」 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 
) 

甚至更​​好,使用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

我認爲IN版本更易於閱讀並且不太可能返回意外結果。 – DOK 2008-11-04 12:52:47

17

您可以嘗試使用周圍或表達式括號,以確保您的查詢的解釋正確,或者更簡潔,使用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) 
11

而且更加容易使用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) 
相關問題