Bernd: mysql Afrage == FALSE, owohl sie in phpmyadmin geht

Hallo Forum,

ich komme da grade nicht auf den Fehler, bitte helft mir mal.

Eine Query, die seit langem problemlos geht, macht jetzt einen Fehler, obwohl ch an dem Script und an den Tabellen nichts geändert habe. Vermutung ist also, dass mein Hoster eine Änderung vorgenommen hat?

  
select DISTINCT  
...  
FROM tabel1 r  
LEFT JOIN table2 z  
ON r.ID = z.ID  
WHERE  
... AND  
COALESCE(z.neu, 0) = 0  
ORDER BY ...  

So sieht die Abfrage aus.

Im php-Teil pack ich das dann natürlich in eine Variable $query und führe wie folgt aus.

  
$result=mysql_query($query);  
if ($result_rgkontroll==FALSE)  
{  
# ab hier dann meine Fehlerfunktion  
}  

Und genau da hakt es nun.

Die Fehlerfunktion wird ausgeführt.

Wenn ich aber $query ausgeben lasse und in phpmyadmin ausführe, erhalte ich eine durchaus staatliche Ergebnissmenge.

Kann mir das einer erklären?

Bernd

  1. Hallo Forum,

    Bitte Ausgngspost vergesen oder löschen, da war ein  Fehler im Code drinne!

    ich komme da grade nicht auf den Fehler, bitte helft mir mal.

    Eine Query, die seit langem problemlos geht, macht jetzt einen Fehler, obwohl ch an dem Script und an den Tabellen nichts geändert habe. Vermutung ist also, dass mein Hoster eine Änderung vorgenommen hat?

    select DISTINCT  
    ...  
    FROM tabel1 r  
    LEFT JOIN table2 z  
    ON r.ID = z.ID  
    WHERE  
    ... AND  
    COALESCE(z.neu, 0) = 0  
    ORDER BY ...
    

    So sieht die Abfrage aus.

    Im php-Teil pack ich das dann natürlich in eine Variable $query und führe wie folgt aus.

    $result=mysql_query($query);  
    if ($result==FALSE)  
    {  
    # ab hier dann meine Fehlerfunktion  
    }
    

    Und genau da hakt es nun.

    Die Fehlerfunktion wird ausgeführt.

    Wenn ich aber $query ausgeben lasse und in phpmyadmin ausführe, erhalte ich eine durchaus staatliche Ergebnissmenge.

    Kann mir das einer erklären?

    Bernd

    1. Tach!

      $result=mysql_query($query);

      if ($result==FALSE)
      {

      ab hier dann meine Fehlerfunktion

      }

      
      > Die Fehlerfunktion wird ausgeführt.  
        
      Was für einen Fehler berichtet denn mysql\_error()?  
        
        
      dedlfix.
      
      1. Was für einen Fehler berichtet denn mysql_error()?

        Hi dedlfix,

        immer wieder schön, dass Du einem die entscheidenden Tips gibts. (auch wenn ich mich justament etwas ärgere, da nicht selber zuallererst mal nachgesehn zu haben, was mysql_error() ausgibt).

        Also, ich erhalte:

          
        The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay  
        
        

        Das alleine löst mein Problem nicht, denn ich muß die Abfrage umbauen.

        Aber es erklärt mir, warum ohne weiteres "zutun" eine Abfrage einen "Fehler" produziert hat, denn das machte mir viel größere Kopfschmerzen.

        Nun nochmal zur Fehlermeldung:

        Was genau sagt die aus? Denn die Ergebnissmenge ist sicher nicht gemeint. Die enthält über phpmyadmin 15 Datensätze.

        Schönen Gruß, Bernd

        1. The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

          ...  
          
          > Was genau sagt die aus? Denn die Ergebnissmenge ist sicher nicht gemeint. Die enthält über phpmyadmin 15 Datensätze.  
            
          Übersetze mal die Fehlermeldung halbwegs richtig:  
          "Das SELECT will mehr Zeilen UNTERSUCHEN als (durch die Konfigurationsvariable) MAX\_JOIN\_SIZE erlaubt ist."  
            
          Der JOIN hat eine zu große Ergebnismenge, die erst nachträglich  durch die WHERE-Clausel eingeschränkt wird. MAX\_JOIN\_SIZE soll offensichtlich vor einer unabsichtlichen übermäßigen Speichernutzung durch einen einzelnen Benutzer schützen.  
            
          Dein Hoster hat wissentlich oder unwissentlich an den Performance-Schrauben gedreht oder es gibt einen anderen Grund wie z.B. gewachsene Tabellen.  
            
          phpmyadmin setzt scheinbar diesen Schutzmechanismus außer Kraft in dem es automatisch SQL\_BIG\_SELECTS positiv setzt.  
            
          Fred
          
        2. Tach!

          The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

          Die Fehlermeldung ist Text und kein SQL-Code, zeichne sie bitte nicht als solchen aus.

          Das alleine löst mein Problem nicht, denn ich muß die Abfrage umbauen.

          Möglicherweise ja. Mit dem gegebenen Code kann dir das aber niemand genau sagen. Vielleicht ist ein Subselect statt einem Join die bessere Lösung.

          Nun nochmal zur Fehlermeldung:
          Was genau sagt die aus? Denn die Ergebnissmenge ist sicher nicht gemeint. Die enthält über phpmyadmin 15 Datensätze.

          Die Zwischenergebnismenge ist gemeint. Erst muss der Join alle Datensätze zusammentragen, dann erst kann das Where tätig werden. So zumindest die den Optimizer nicht berücksichtigende Theorie. Aber der kann anscheinend in deinem Fall auch nichts mehr retten.

          dedlfix.

        3. Hallo Bernd,

          The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

          
          >   
          > Was genau sagt die aus? Denn die Ergebnissmenge ist sicher nicht gemeint. Die enthält über phpmyadmin 15 Datensätze.  
            
          MySQL muss Anzahl Datensätze in Tabelle 1 mal Anzahl Datensätze in Tabelle 2 (und vielleicht noch mal Anzahl Datensätze in Tabelle 3, ...) untersuchen.  
            
          Die Kombination von JOIN und DISTINCT legt die Vermutung nahe, dass Du in Wirklichkeit eher Subselects einsetzen willst. Natürlich ist es eine gute Idee, EXPLAIN zu befragen, nachdem Du die Abfrage erfolgreich umgebaut hast, um herauszufinden, welche Version performanter ist.  
            
            
          Freundliche Grüße  
            
          Vinzenz
          
          1. Die Kombination von JOIN und DISTINCT legt die Vermutung nahe, dass Du in Wirklichkeit eher Subselects einsetzen willst. Natürlich ist es eine gute Idee, EXPLAIN zu befragen, nachdem Du die Abfrage erfolgreich umgebaut hast, um herauszufinden, welche Version performanter ist.

            Hi Vinzenz und alle anderen,

            ich wüßte mal gerne, warum ausgerechnet diese Abfrage solch ein Problem macht. Ich habe unzählige JOINS, die ich für komplizierter halte.

            Also gut, was mache ich?

            Ich habe eine Tabelle mit Adressdaten und eine, in die ich lediglich dann etwas eintrage, wenn die Adresse ein bestimmtes Kriterium erfüllt. Dann allerdings mit zusätzlichen Daten. Beide Tabellen verbindet die AdressID.

            Tab1:

            AdressID, Name, Strasse, Ort

            Tab2:

            ID, AdressID, Spalte1, Spalte2, Spalte3

            Query:

              
            select DISTINCT \n  
            r.AdressID,  
            r.Name,  
            r.Strasse,  
            r.Ort,  
            z.Spalte2  
            FROM tab1 r  
            LEFT JOIN tab2 z  
            ON r.AdressID = z.AdressID  
            WHERE  
            AdressID = 10 AND  
            COALESCE(z.Spalte2, 0) = 0  
            ORDER BY r.AdressID DESC  
            
            

            Ganz ehrlich, ich verstehe nicht, warum diese Abfrage so viele Kombinationen ergeben soll. I der entsprechenden Tabelle sind ca. 4000 Einträge in der Adress-Tabelle und 2000 in der tab2.

            Wer erklärt mir, warum das für mysql ein Problem ist und wie ich es umgehe?

            Bernd

            1. Tach!

              Vinzenz wird dir sicher noch genaueres sagen können.

              Wer erklärt mir, warum das für mysql ein Problem ist und wie ich es umgehe?

              Aber MySQL kann teilweise selbst Ansätze für eine Erklärung liefern. Lass mal das Statement mit einem vorangestellten EXPLAIN laufen.

              dedlfix.

            2. Hallo,

              Ich habe eine Tabelle mit Adressdaten und eine, in die ich lediglich dann etwas eintrage, wenn die Adresse ein bestimmtes Kriterium erfüllt. Dann allerdings mit zusätzlichen Daten. Beide Tabellen verbindet die AdressID.

              Tab1:
              AdressID, Name, Strasse, Ort

              Trägt AdressID den Primärschlüssel dieser Tabelle?

              Tab2:
              ID, AdressID, Spalte1, Spalte2, Spalte3

              auf der einen Seite gehe ich davon aus, dass zu jedem Eintrag in Tabelle Tab1 mehrere Einträge in Tabelle Tab2 existieren können, andererseits sollte in jedem Fall auf der Spalte AdressID ein Index liegen.

              Query:

              select DISTINCT
                  r.AdressID,
                  r.Name,
                  r.Strasse,
                  r.Ort,
                  z.Spalte2
              FROM tab1 r
              LEFT JOIN tab2 z
              ON r.AdressID = z.AdressID
              WHERE
                  AdressID = 10 AND
              COALESCE(z.Spalte2, 0) = 0
              ORDER BY r.AdressID DESC

                
              Sorry, aber \*diese\* Abfrage kann maximal zwei Datensätze liefern (falls AdressID den Primärschlüssel in Tabelle tab1 trägt):  
                
              Gib mir alle unterschiedlichen Datensätze zu einer bestimmten AdressID, wobei mich nur die Datensätze interessieren, zu denen es  
                
              a) entweder keinen Eintrag in tab2 gibt,  
              b) oder der zugehörige Eintrag in tab2 in der Spalte "Spalte2"  
                 den Wert NULL oder 0 aufweist.  
                
              Somit gibt es genau zwei mögliche Werte für Spalte2: nämlich 0 oder NULL.  
              Wo sollen da 10 bis 15 Datensätze herkommen? Ich fürchte, Du hast zu stark vereinfacht.  
                
              Wenn Du nur Datensätze mit einem bestimmten Wert in der Detailtabelle suchst (oder auch solche ohne zugeordneten Wert in der Detailtabelle), dann solltest Du diese Bedingung in der JOIN-Bedingung aufführen, nicht in der WHERE-Klausel mit einem zusätzlichen COALESCE.  
                
              Wie dedlfix Dir bereits geschrieben hat, solltest Du Dir von MySQL den Ausführungsplan anzeigen lassen.  
                
                
                
              Freundliche Grüße  
                
              Vinzenz
              
              1. Tab1:
                AdressID, Name, Strasse, Ort

                Trägt AdressID den Primärschlüssel dieser Tabelle?

                Ja.

                Tab2:
                ID, AdressID, Spalte1, Spalte2, Spalte3

                auf der einen Seite gehe ich davon aus, dass zu jedem Eintrag in Tabelle Tab1 mehrere Einträge in Tabelle Tab2 existieren können, andererseits sollte in jedem Fall auf der Spalte AdressID ein Index liegen.

                Lag nicht. Ich habe es geändert.

                EXPLAIN vorher:

                id select_type table type possible_keys key key_len ref rows Extra
                1 SIMPLE r ALL PRIMARY NULL NULL NULL 3950 Using where; Using temporary; Using filesort
                1 SIMPLE z ALL NULL NULL NULL NULL 2106 Using where

                EXPLAIN danach:

                id select_type table type possible_keys key key_len ref rows Extra
                1 SIMPLE r ALL PRIMARY NULL NULL NULL 3950 Using where; Using temporary; Using filesort
                1 SIMPLE z ref AdressID AdressID 4 r.AdressID 1 Using where

                Aber unabhängig davon kommt da ohnehin Unsinn  im Ergebnis raus.

                Abfrage:

                Nenne mir die Adressdaten, zu denen in Tabelle2 entweder keine Eintrag existiert oder ein Eintrag in Tabelle2 mit dem Wert 0 in  Spalte2 existiert?

                Bernd

                1. Nenne mir die Adressdaten, zu denen in Tabelle2 entweder keine Eintrag existiert oder ein Eintrag in Tabelle2 mit dem Wert 0 in  Spalte2 existiert?

                  Ich habe das jetzt so umgesetzt, es scheint auch zu funktionieren:

                    
                  select  
                  r.AdressID  
                  FROM tab1 r  
                  WHERE r.AdressID NOT IN (SELECT DISTINCT z.AdressID FROM tab2 z WHERE z.Spalte2 = 1) AND  
                  r.ID2 = 10  
                  
                  

                  Bernd

    2. Hallo,

      Eine Query, die seit langem problemlos geht, macht jetzt einen Fehler, obwohl ch an dem Script und an den Tabellen nichts geändert habe. Vermutung ist also, dass mein Hoster eine Änderung vorgenommen hat?

      welche Version von MySQL ist jetzt im Einsatz?
      War früher eine andere im Einsatz?

      So sieht die Abfrage aus.

      unvollständiger Code ist meist so gut wie gar keiner ...

      $result=mysql_query($query);

      if ($result==FALSE)
      {

      ab hier dann meine Fehlerfunktion

        
      und warum fragst Du hier nicht [mysql_error](http://de2.php.net/manual/de/function.mysql-error.php) ab, um einen Anhaltspunkt dafür zu haben, was schief läuft?  
        
      Wird $query dynamisch zusammengebaut? Wenn ja, hast Du den [Kontextwechsel](http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel) beachtet?  
        
        
      Freundliche Grüße  
        
      Vinzenz