mysql5 - Query will nicht
Franz. Z.
- datenbank
1 Vinzenz Mai0 Franz. Z.
Hi,
hier meine Query:
SELECT ID, Status
FROM table
WHERE Name LIKE "%Franz%"
OR Name2 LIKE "%Franz%"
AND Status LIKE "%AB%"
AND geloescht !=1
Und hier mein Problem:
Ich erhalte in der Ergebnismenge auch Treffer mit Status BB, BC und BD.
Woran liegt das?
Grüße, Franz
Hallo,
SELECT ID, Status
FROM table
WHERE Name LIKE "%Franz%"
OR Name2 LIKE "%Franz%"
AND Status LIKE "%AB%"
AND geloescht !=1
Ich erhalte in der Ergebnismenge auch Treffer mit Status BB, BC und BD.
Woran liegt das?
vermutlich an fehlenden Klammern und der von Dir nicht berücksichtigten Operatorrangfolge. Dein Statement wird wie folgt verarbeitet:
``~~~sql
SELECT
ID,
Status
FROM
tabelle
WHERE
Name LIKE '%Franz%' -- es ist eine sehr gute Idee, Zeichenketten in
-- SQL immer in einfache Anführungszeichen zu
-- setzen. Viele SQL-Dialekte mögen keine doppelten,
-- inklusive MySQL im ANSI-Mode
OR (
Name2 LIKE '%Franz%'
AND Status LIKE '%AB%'
AND geloescht !=1
)
Ich vermute allerdings, dass Du statt dieser impliziten Klammerung eher folgende explizite Klammerung haben möchtest.
~~~sql
SELECT
ID,
Status
FROM
tabelle
WHERE (
Name LIKE '%Franz%'
OR Name2 LIKE '%Franz%'
)
AND Status LIKE '%AB%'
AND geloescht !=1
haben möchtest, d.h. dass Franz in Name oder Name2 vorkommen muss, der Status AB enthalten soll und gelöscht ungleich 1 sein soll.
Freundliche Grüße
Vinzenz
vermutlich an fehlenden Klammern und der von Dir nicht berücksichtigten Operatorrangfolge. Dein Statement wird wie folgt verarbeitet:
Hallo Vinzenz,
aber ich dachte, genau weil ich die Operatorenreihenfolge beachtet hatte, wärs auch ohne Klammern gegangen. Hm... :-(
Hat nicht OR Vorrang vor AND?
Das mit den einfachen Anführungszeichen ist gebongt, danke für den Hinweis.
Und ja, Du hast völlig recht, ich möchte die explizite Klammerung.
Trotzdem meine Frage: Warum ist die Klammer überhaupt nötig? Hat doch AND den Vorrang?
Grüße und 1000Dank an Dich, Franz
Hallo Franz,
aber ich dachte, genau weil ich die Operatorenreihenfolge beachtet hatte, wärs auch ohne Klammern gegangen. Hm... :-(
Hat nicht OR Vorrang vor AND?
nein, siehe englische Version des MySQL-Handbuchs, Operator Precedence.
Trotzdem meine Frage: Warum ist die Klammer überhaupt nötig? Hat doch AND den Vorrang?
ja, auch wenn die deutsche Version, der Abschnitt "Rangfolge von Operatoren" dies nicht so deutlich macht wie das englische Gegenstück:
"Umgekehrte Reihenfolge" ist nicht präzise, sondern schwammig, "in aufsteigender Reihenfolge von niedrigster zu höchster Priorität" wäre klarer, denn aufsteigend sortieren ist durchaus normal, gerade im Datenbankumfeld :-)
Freundliche Grüße
Vinzenz
"Umgekehrte Reihenfolge" ist nicht präzise, sondern schwammig, "in aufsteigender Reihenfolge von niedrigster zu höchster Priorität" wäre klarer, denn aufsteigend sortieren ist durchaus normal, gerade im Datenbankumfeld :-)
Aaah... Käskuchen!
Bin ich drauf reingefallen.
Jetzt wird alles klar, dank Dir :-)
Franz