Yadgar: [MySQL 5.0] Merkwürdige Fehlermeldung

High!

Inzwischen ist meine Datenbank für elektronische Orgeln ("Greenbook") online, auch die ersten einfacheren Queries sind schon implementiert... aber jetzt fängt es an, kompliziert zu werden.

Wieso bekomme ich für

  
select marken.Markenname, orgeln.Modell from orgeln inner join orgeln_klaviaturen on orgeln.Nr=Orgel_Nr, marken where orgeln.Marke=marken.Nr and Klaviatur_Nr in (7, 8, 9, 10, 11, 36, 37, 39, 46, 48, 55, 58, 65, 66, 67, 69, 70, 71, 72) order by Markenname;  

eine einwandfreie als Tabelle formatierte Ausgabeliste angezeigt, nicht aber für die nächste im am Anfang des Skripts definierten Query-Array eingetragen Abfrage

  
select marken.Markenname, orgeln.Modell from orgeln left outer join(select count(*) as Anzahl, Orgel_Nr from orgeln_klaviaturen group by Orgel_Nr) as Andere_Tabelle on orgeln.Nr=Andere_Tabelle.Orgel_Nr, marken where Andere_Tabelle.Anzahl=2 and orgeln.Marke=marken.Nr order by Markenname, Modell;  

sondern stattdessen eine Fehlermeldung:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /www/htdocs/w009259e/greenbook/display.php on line 22

und anschließend eine leere Tabelle (0 Zeilen) - obwohl in der lokal gespeicherten Version der Datenbank beide Queries korrekte Ergebnisse lieferten!

Bis bald im Khyberspace!

Yadgar

  1. Hi,

    select marken.Markenname, orgeln.Modell from orgeln left outer join(select count(*) as Anzahl, Orgel_Nr from orgeln_klaviaturen group by Orgel_Nr) as Andere_Tabelle on orgeln.Nr=Andere_Tabelle.Orgel_Nr, marken where Andere_Tabelle.Anzahl=2 and orgeln.Marke=marken.Nr order by Markenname, Modell;

      
    ohne es geprüft zu haben:  
    Ich denke, nach dem "join" gehört ein Space!  
    Du definierst dahinter eine Tabelle (zwar als Subselect, aber egal). Die beiden Wort müssen getrennt werden.  
      
    Probier mal, keine Gewähr.  
      
    Gruß  
    Reiner
    
    1. High!

      Ich denke, nach dem "join" gehört ein Space!
      Du definierst dahinter eine Tabelle (zwar als Subselect, aber egal). Die beiden Wort müssen getrennt werden.

      Probier mal, keine Gewähr.

      Funktioniert leider immer noch nicht...

      Bis bald im Khyberspace!

      Yadgar

  2. Hello,

    select marken.Markenname, orgeln.Modell from orgeln inner join orgeln_klaviaturen on orgeln.Nr=Orgel_Nr, marken where

    ^^^^^^^^^^

    wird dein Problem wohl nicht lösen, aber hier ist mal eine extrem ungute Mischung aus explizitem und implizitem Join. Sicher, dass das unter MySQL überhaupt noch das gewünschte Verhalten hat? Das wurde nämlich geändert.  
    Ansonsten: was sagt denn PHPMyAdmin bzw. MySQL selbst? Offensichtlich scheint es einen Fehler gefunden zu haben.  
      
    MfG  
    Rouven  
    
    -- 
    \-------------------  
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& ([SelfCode](http://selfspezial.atomic-eggs.com/scode/selfcode.php?encodieren))  
      
    I will never understand why Germans feel the need to kill trees  --  Arbeitskollege aus UK zum Thema ob eine Dokumentation elektronisch oder auf Papier ausgeliefert wird
    
    1. High!

      wird dein Problem wohl nicht lösen, aber hier ist mal eine extrem ungute Mischung aus explizitem und implizitem Join.

      Also die dritte Tabelle (marken) auch noch mit inner join anschließen?

      Sicher, dass das unter MySQL überhaupt noch das gewünschte Verhalten hat? Das wurde nämlich geändert.

      In welcher Version? Bei mir lokal und auf meinem Webserver ist es immer noch 5.0!

      Ansonsten: was sagt denn PHPMyAdmin bzw. MySQL selbst? Offensichtlich scheint es einen Fehler gefunden zu haben.

      Wie gesagt, lokal ist alles einwandfrei... aber auf dem Server dann Fehler 1064!
      Qu'est-ce que c'est?

      Bis bald im Khyberspace!

      Yadgar

  3. Hi,

    sondern stattdessen eine Fehlermeldung:

    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource

    Wieso zum Geier nutzt du nicht mysql_error?

    MfG ChrisB

  4. echo $begrüßung;

    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /www/htdocs/w009259e/greenbook/display.php on line 22

    Das ist eine der häufigsten Fehlermeldungen, und sie stellt nur einen Folgefehler dar. Du hast offensichtlich keine Auswertung von Fehlerzuständen in deinem Script. (Fast) jede mysql_*-Funktion liefert im Fehlerfall ein false statt des sonst üblichen Ergebnisses. Dieses false ist kein gültiger Wert für nachfolgende mysql_*-Funktionen, weswegen sich diese dann mit o.g. Fehlermeldung beschwert. Der genaue Wortlaut des Fehlers teilt dir in den eben genannten Fällen die Funktion mysql_error() mit. Wenn du nun irgendwo ein "or die(mysql_error())" als Anhängsel an die mysql_*-Funktionen findest, dann ist das eine sehr ungünstige Art, auf Fehler zu reagieren. (Notschlachten mit öffentlicher Obduktion aufgrund eines Niesers wäre damit vergleichbar.) Besser ist es, sich ein Konzept zu überlegen, was man im Fehlerfall dem Besucher präsentiert, ohne ihn dabei mit Details aus den Innereinen des Servers zu versorgen, und zum anderen man als Administrator die Fehlermeldungen zu Gesicht bekommt um sie auswerten zu können.

    Meine Glaskugel sagt mir, dass die Versionen von MySQL zu Hause und auf dem Server unterschiedlich sind. Auf dem Server wird Version 4.0 oder noch kleiner zu finden sein. Die kann keine Subselects. Doch lass dir das von MySQL selbst sagen -> Fehlerbehandlung ins Script einbauen.

    echo "$verabschiedung $name";

    1. High!

      Meine Glaskugel sagt mir, dass die Versionen von MySQL zu Hause und auf dem Server unterschiedlich sind. Auf dem Server wird Version 4.0 oder noch kleiner zu finden sein. Die kann keine Subselects. Doch lass dir das von MySQL selbst sagen -> Fehlerbehandlung ins Script einbauen.

      In der Tat... select version() ergibt 4.0.25... jetzt werde ich die Queries wohl umstricken müssen!

      Und das wird ein Problem, da Subqueries ja erst ab 4.1 drin sind!

      Konkret geht es um Folgendes: Es gibt (unter anderem) in meiner Datenbank eine Stammdatentabelle "Orgeln" (die z. B. die Modellnamen) enthält, eine Stammdatentabelle "Marken" und eine Stammdatentabelle "Klaviaturen". Da zwischen "Orgeln" und "Klaviaturen" eine n:n-Beziehung besteht (jede Orgel hat ein Pedal und mindestens ein Manual, also mindestens 2 Klaviaturen, wie umgekehrt jeder Klaviaturtyp an beliebig vielen Orgeln verbaut sein kann) außerdem eine Relationentabelle Orgeln_Klaviaturen.

      Mir alle Orgelmodelle mit der Anzahl ihrer Klaviaturen anzeigen zu lassen (die Markennamen lasse ich der Einfachheit halber hier erstmal weg) ist kein Problem:

        
      select orgeln.Modell, count(*) as Anzahl from orgeln_klaviaturen inner join orgeln where orgeln.Nr = Orgel_Nr group by Orgel_Nr;  
      
      

      Aber wie kann ich diese Ausgabe auf einen bestimmten Wert in "Anzahl" einschränken, ohne eine Subquery zu verwenden? "Anzahl" entsteht ja erst in dieser Abfrage...

      Bis bald im Khyberspace!

      Yadgar

      1. Hi,

        select orgeln.Modell, count(*) as Anzahl from orgeln_klaviaturen inner join orgeln where orgeln.Nr = Orgel_Nr group by Orgel_Nr;

        Aber wie kann ich diese Ausgabe auf einen bestimmten Wert in "Anzahl" einschränken, ohne eine Subquery zu verwenden? "Anzahl" entsteht ja erst in dieser Abfrage...

        HAVING ...?

        MfG ChrisB

        1. High!

          HAVING ...?

          Bingo! Jetzt stellt sich nur noch die Frage, ob und wie ich die Ausgabe der "Anzahl"-Spalte unterdrücken kann - denn die Information "Orgeln mit x Manualen" geht ja schon aus der Tabellenüberschrift hervor!

          Bis bald im Khyberspace!

          Yadgar

          1. Hi,

            Jetzt stellt sich nur noch die Frage, ob und wie ich die Ausgabe der "Anzahl"-Spalte unterdrücken kann

            Wenn du sie nicht ausgegeben haben willst, dann gebe sie doch einfach nicht mit aus ...?

            MfG ChrisB

            1. Hi,

              Wenn du sie nicht ausgegeben haben willst, dann gebe sie doch einfach nicht mit aus ...?

              ...dann verschwindet aber doch auch count(*) als Berechnungsgrundlage für die Klaviaturen-Anzahlen aus der Abfrage - und wo sonst als unter SELECT... sollte count(*) stehen?

              Bis bald im Khyberspace!

              Yadgar

              1. Hi,

                Wenn du sie nicht ausgegeben haben willst, dann gebe sie doch einfach nicht mit aus ...?

                ...dann verschwindet aber doch auch count(*) als Berechnungsgrundlage für die Klaviaturen-Anzahlen aus der Abfrage - und wo sonst als unter SELECT... sollte count(*) stehen?

                a) Was hat denn die Datenermittlung mit der Ausgabe zu tun?
                b) HAVING COUNT(...) sollte auch gehen.

                MfG ChrisB

              2. High!

                ...dann verschwindet aber doch auch count(*) als Berechnungsgrundlage für die Klaviaturen-Anzahlen aus der Abfrage - und wo sonst als unter SELECT... sollte count(*) stehen?

                Ich stelle gerade fest, dass count(*) auch hinter HAVING stehen kann... dann funktioniert es! Danke für den Tipp!

                Bis bald im Khyberspace!

                Yadgar