Franz. Z.: mysql5 - Query will nicht

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

  1. 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

    1. 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

      1. 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

        1. "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