2013-07-30 9 views
7

Ich habe eine MySQL-Anweisung, wo ich versuche, Aussagen abhängig davon, wo sie "gehören" auszuschließen Die Abfrage durchläuft, aber es zeigt immer noch die Zeilen, die ich ausdrücklich gesagt, wo es nicht gleich ist?MySQL - Wo oder?

SELECT id, belongsto, title, madeby, sticky, locked, lastpost, posts 
FROM threads 
WHERE sticky !=1 
AND belongsto !=12 OR sticky !=1 AND belongsto !=13 
ORDER BY `threads`.`date` DESC 
LIMIT 20 
+0

Sie brauchen nicht wirklich 'OR', da Sie auf beiden die gleichen Kriterien von' sticky! = 1' wiederholen. –

+0

Entfernen von "ODER-Sticky! = 1" aus der Abfrage würde ausreichen, um das Problem zu beheben. Die OR-Bedingung macht es so, dass ein Wert von 12 eine Seite erfüllt und ein Wert von 13 die andere Seite, so dass diese Werte nicht "ausgeschlossen" werden. – spencer7593

Antwort

23

Sie benötigen Klammern um Ihre OR Aussagen zu gruppieren sie zusammen logisch.

WHERE sticky !=1 
AND belongsto !=12 OR sticky !=1 AND belongsto !=13 

sollte sein:

WHERE (sticky !=1 AND belongsto !=12) 
OR (sticky !=1 AND belongsto !=13) 

oder besser noch:

WHERE sticky !=1 AND belongsto NOT IN(12,13) 
+0

gehören NICHT IN (12,13,14), das ist einfach genial :) Danke. Funktioniert perfekt. –

+2

Keine Klammern sind "benötigt". Der Operator AND hat eine höhere Priorität als der Operator OR. das Hinzufügen von Klammern (wie unter "sollte sein:") ändert die Aussage nicht; Das behebt das Problem nicht. Das Umschreiben unter "besser noch" ändert die Aussage. – spencer7593

+0

der Weg zu gehen ist 'NOT IN()' sicher, danke – RozzA

2

Wenn das Ziel ausschließen Zeilen mit belongsto Werte von 12 und 13 ist, dann ist die OR sollte ersetzt durch AND.

Die Behauptung (in der ausgewählten Antwort), dass Klammern "fehlen" und hinzugefügt werden müssen, ist falsch. Das Hinzufügen von Klammern ändert die Änderung der Anweisung nicht. Der AND Betreiber hat bereits eine höhere Priorität als der OR Operator)

WHERE sticky !=1 
AND belongsto !=12 AND sticky !=1 AND belongsto !=13 
        ^^^ 

Weil es unnötig zweimal das gleiche Prädikat zu wiederholen, diese neu geschrieben werden können als:.

WHERE sticky !=1 
AND belongsto !=12 AND belongsto !=13 

Welche auch geschrieben werden kann als :

WHERE sticky !=1 
    AND NOT (belongsto =12 OR belongsto =13) 

auch mit neu geschrieben werden Dies kann NOT IN (12,13) (wie in der gewählten Antwort demonstriert) .