2008-11-04 7 views
44

Also ich ', einige Code debuggen und es gibt die folgende SQL-Abfrage (vereinfacht von dem, was es wirklich ist).Wie wählt man aus, wo x gleich mehreren Werten ist?

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 

Ich bin immer sehr seltsame Ergebnisse aus der Abfrage und ich denke das, weil der erste oder negiert die AND ‚s, die vor ihm sind. So bekomme ich Ergebnisse für Anzeigen aller Art und nicht nur von Typ 13. Jedes Mal, wenn die Abfrage aufgerufen wird, kann es viele Bezirke geben, die nachschlagen müssen oder nur ein paar.

Jede Hilfe auf dem richtigen Weg, um dies zu tun würde geschätzt.

Antwort

98

Put Klammern um die "OR" 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 
) 

Oder noch besser, verwenden Sie 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

Ich denke, die IN-Version ist einfacher zu lesen und weniger wahrscheinlich, unerwartete Ergebnisse zu liefern. – DOK

+4

es ist auch *** wesentlich schneller, zumindest auf MySQL – warren

+1

In meinem Fall kommen die Werte in der 'IN' aus dem Ergebnis einer anderen Select-Abfrage, wie gehe ich damit um? –

17

Sie können versuchen, Klammern um die OR Ausdrücke um sicherzustellen, dass Ihre Abfrage interpretiert unter Verwendung richtig oder prägnante, verwenden Sie 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

und noch einfacher mit 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) 
Verwandte Themen