Ich habe diese Abfrage:
%Vor%Was nicht die richtigen Ergebnisse liefert. Das Hinzufügen von Klammern um die OR-Bedingungen funktioniert jedoch folgendermaßen:
%Vor%Meine Frage ist, warum ist es anders? Ich verstehe, dass die OR-Anweisung anders ohne die Klammern betrachtet wird; aber ich verstehe nicht, wie es anders ist.
Ich habe keine Dokumente gefunden, die hilfreich gewesen wären. Wenn da draußen irgendwelche Links sind, würde ich es sehr zu schätzen wissen.
Dies liegt daran, dass OR eine niedrigere Priorität Operatoren als UND. Immer wenn die DB einen Ausdruck wie
sieht %Vor%Das AND wird zuerst ausgewertet, d. h. es ist äquivalent zu
%Vor%Also wenn du explizit
willst %Vor%stattdessen müssen Sie die Klammern setzen.
Dies ist übrigens nicht spezifisch für SQL. Die Rangfolge dieser Operatoren ist in allen mir bekannten Programmiersprachen (d. H. Mindestens C-, C ++ -, C # -, Java- und Unix-Shell-Skripten) gleich.
In diesem Beispiel erhalten Sie alle Datensätze, die entweder
sinda) Die date_next_payment ist vor dem 2. Februar 2011 UND Status ist aktiv
b) Der Status ist past_due
So werden die Datensätze für die Vergangenheit nicht durch das Datum eingeschränkt.
%Vor%In diesem Beispiel erhalten Sie alle Datensätze mit
a) Die date_next_payment ist vor dem 2. Februar 2011
AND
b) Der Status ist entweder aktiv oder past_due
Die Klammern funktionieren wie in Mathematik oder Logik - die Anweisungen in den Klammern werden zuerst ausgewertet ... stellen Sie sich also vor, dass jeder Schritt wie folgt abläuft:
%Vor%Es wurde also ein Datensatz mit einem Status von aktiv ...
gefunden %Vor%Dies wird dann mit der OR-Bedingung ... (TRUE OR FALSE) == TRUE
ausgewertet %Vor%Und das Datum ist 2011-01-01
%Vor%Und schließlich, TRUE und TRUE == TRUE
%Vor%Und so wird der Datensatz zurückgegeben ...
Wenn Sie sich vorstellen, dass Ihre Abfrage in solchen Schritten für jede Zeile in der Datenbank ausgeführt wird, hilft es manchmal zu verstehen, wo Sie Ihre Klammern setzen müssen.
in
%Vor% wird zuerst date_next_payment <= '2011-02-02' AND status = 'active'
berücksichtigen und dann wird die boolesche Antwort ODER mit status = 'past due'
Während in
%Vor%Zuerst ODER wird gemacht und dann Und wird gemacht ... Das ist die Antwort
Das MySQL-Handbuch enthält eine Seite zu Vorrang für den Betreiber . Es zeigt, dass AND eine höhere Priorität hat. So wird p1 AND p2 OR p3
als (p1 AND p2) OR p3
interpretiert. Eine Wahrheitstabelle wird Sie leicht davon überzeugen, dass dies anders ist als p1 AND (p2 OR p3)
.
Sie ändern die Bedingung, wenn Sie die Klammern hinzufügen.
Im ersten Fall besteht die Ergebnismenge aus den Datensätzen, die die Bedingungen
erfüllen %Vor%oder die Bedingung
%Vor%Nachdem Sie die Klammern hinzugefügt haben, besteht die Ergebnismenge aus den Datensätzen, die die Bedingung
erfüllen %Vor%und eine der Bedingungen
%Vor%oder
%Vor% Bei Ihrer ersten Suchanfrage
status
= 'active' ist die Bedingung false und nicht die nächste Statusspaltenbedingung ( status
).
in Ihrer zweiten Abfrage
Klammern () haben eine hohe Priorität
. Also ( status
= 'aktiv' ODER status
= 'überfällig') Bedingung zuerst auswerten.
Wenn Sie die Klammern nicht verwenden, sagen Sie tatsächlich:
%Vor%Dies bedeutet, dass bei Status '=' überfällig 'auch dieser Datensatz angezeigt wird. ohne die anderen Bedingungen zu überschreiten.
Aber wenn Sie Klammern verwenden, benötigen Sie:
%Vor%AND, um eine der beiden anderen Bedingungen zu bestehen.