Rolf: woher kommt dieser Result

Hallo,

ein Query liefert zwar exakte Ergebnisse, aber der erste Record ist Murks:

   SELECT c.cID, c.descr, COUNT(o.oID)  
     FROM objects   AS o  
LEFT JOIN matrix    AS m ON o.oID = m.oID  
LEFT JOIN categorie AS c ON c.cID = m.cID  
LEFT JOIN kuenstler AS k ON o.kID = k.kID  
    WHERE o.FG = 'Y' AND k.FG = 'Y'  
 GROUP BY c.cID ORDER BY c.descr

Mit "Matrix" werden den Objekten Kategorien zugewiesen.
Das Ergebnis sieht wie folgt aus:

Array  
(  
  [0] => Array  
      (   [0] =>  
          [1] =>  
          [2] => 1  
      )  
  [1] => Array  
      (  
          [0] => 2  
          [1] => Original Grafik  
          [2] => 214  
      )  
  [2] => Array  
      (   [0] => 3  
          [1] => Skulptur  
          [2] => 69  
      )  
)

Leider habe ich keine Idee, wie das erste Element entstehen könnte,
weshalb ich auch nicht weiss, wo ich mit der Fehlersuche ansetzen könnte.
Bin für jeden Tip Dankbar ...

m.b.G. Rolf

  1. Hallo,

    ein Query liefert zwar exakte Ergebnisse, aber der erste Record ist Murks:

    SELECT c.cID, c.descr, COUNT(o.oID)

    FROM objects   AS o
    LEFT JOIN matrix    AS m ON o.oID = m.oID
    LEFT JOIN categorie AS c ON c.cID = m.cID
    LEFT JOIN kuenstler AS k ON o.kID = k.kID
        WHERE o.FG = 'Y' AND k.FG = 'Y'
    GROUP BY c.cID ORDER BY c.descr

      
    
    > Das Ergebnis sieht wie folgt aus:  
    > ~~~php
    
    Array  
    
    > (  
    >   [0] => Array  
    >       (   [0] =>  
    >           [1] =>  
    >           [2] => 1  
    >       )  
    >   [1] => Array  
    >       (  
    >           [0] => 2  
    >           [1] => Original Grafik  
    >           [2] => 214  
    >       )  
    >   [2] => Array  
    >       (   [0] => 3  
    >           [1] => Skulptur  
    >           [2] => 69  
    >       )  
    > )
    
    

    warum so kompliziert?

    also lautet das Ergebnis Deiner Abfrage

    cID   descr                COUNT(o.oID
    -------------------------------------
    NULL  NULL                    1
    2     Original Grafik       214
    3     Skulptur               69

    Richtig?

    Datenbankmanagementsystem müsste MySQL sein, weil jedes andere mir bekannte DBMS statt eines Resultats einen Syntaxfehler zurückgegeben hätte, es fehlt die Gruppierung nach c.descr. Dies wegzulassen, ändert hier vermutlich nichts  am Resultat, da descr von cID, nach dem Du ja gruppierst abhängig sein sollte.

    Warum sollte es bei Deinen ganzen Left Joins nicht einen Datensatz in objects geben, für den es keinen passenden Eintrag in Matrix oder Kategorie gibt. Möchtest Du diese Datensätze nicht berücksichtigen, so solltest Du einen INNER JOIN und keinen LEFT JOIN verwenden.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      also lautet das Ergebnis Deiner Abfrage

      cID   descr                COUNT(o.oID

      NULL  NULL                    1
      2     Original Grafik       214
      3     Skulptur               69

      Richtig?

      genau!

      Das RDBMS ist MySQL 4.0.27 bei 1&1

      Warum sollte es bei Deinen ganzen Left Joins nicht einen Datensatz in objects geben,
      für den es keinen passenden Eintrag in Matrix oder Kategorie gibt.

      weil es kein Objekt ohne Künstler gibt,
      irgendwer muss es ja verbrochen haben!
      Gleiches gilt für die Kategorien ... eine ist Pflicht, mehrere möglich.

      Da ich keinen Shellzugang habe, muss dieses reichen SQL-Tester.
      Oben stehen die Results zu den Querys, die unten gelistet werden.

      m.b.G. Rolf

      1. Hallo,

        also lautet das Ergebnis Deiner Abfrage

        cID   descr                COUNT(o.oID

        NULL  NULL                    1
        2     Original Grafik       214
        3     Skulptur               69

        Das RDBMS ist MySQL 4.0.27 bei 1&1

        oh je, die ist ja jenseits von Gut und Böse :-(

        Warum sollte es bei Deinen ganzen Left Joins nicht einen Datensatz in objects geben,
        für den es keinen passenden Eintrag in Matrix oder Kategorie gibt.
        weil es kein Objekt ohne Künstler gibt,
        irgendwer muss es ja verbrochen haben!
        Gleiches gilt für die Kategorien ... eine ist Pflicht, mehrere möglich.

        warum dann LEFT JOIN, nimm doch einfach INNER JOIN.

        Da ich keinen Shellzugang habe, muss dieses reichen SQL-Tester.
        Oben stehen die Results zu den Querys, die unten gelistet werden.

        Wenn Du den Datensatz finden willst, der für die NULL-Werte zuständig ist, dann musst Du auf NULL-Wert prüfen:

          
        SELECT  
            o.oID,  
            c.cID  
        FROM  
            objects   AS o  
        LEFT JOIN  
            matrix    AS m ON o.oID = m.oID  
        LEFT JOIN  
            categorie AS c ON c.cID = m.cID  
        WHERE  
            -- c.cID < 1 -- prüft nicht auf NULL  
            c.cID [link:http://dev.mysql.com/doc/refman/4.1/en/comparison-operators.html#operator_is-null@title=IS NULL] -- Prüfung auf NULL-Wert  
        
        

        Übrigens: Deine WHERE-Klausel im Ausgangsposting sorgt dafür, dass zumindest für objects und kuenstler ein INNER JOIN verwendet wird :-)

        Freundliche Grüße

        Vinzenz

        1. Hallo Vinzenz,

          zuerst mal vielen Dank für Deine Hilfe - aber:

          Übrigens: Deine WHERE-Klausel im Ausgangsposting sorgt dafür, dass
          zumindest für objects und kuenstler ein INNER JOIN verwendet wird :-)

          bei anderen RDBMS vielleicht,
          lt. MySQL-Doku existiert kein INNER JOIN, er wird IMHO auf LEFT JOIN gemappt.
          D.h. was man schreibt ist das eine, was MySQL daraus macht etwas anderes ... ;-)

          Dass ich nie auf NULL teste kommt daher, dass in den CREATE-Statements,
          in jedem Feld NOT NULL notiert wird und somit eigentlich gar nicht
          auftreten sollte, oder wie ... <grübel>

          Trotzdem habe ich Dank Deiner Hilfe den Fehler gefunden und beseitigt,
          und morgen wird der Dateneinträger zur Schnecke gemacht ... ;-)

          m.b.G. Rolf

          1. Hello,

            lt. MySQL-Doku existiert kein INNER JOIN, er wird IMHO auf LEFT JOIN gemappt.

            ähm, WAS??
            MySQL ist ab Werk speziell in älteren Versionen etwas SQL-Defekt, aber auch nicht so sehr...

            MfG
            Rouven

            --
            -------------------
            sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
            When the only tool you've got is a hammer, all problems start to look like nails.
            1. Hallo Rouven,

              ähm, WAS??
              MySQL ist ab Werk speziell in älteren Versionen etwas SQL-Defekt, aber auch nicht so sehr...

              hmm,
              ich habe mich ja auch nicht beschwert ... ;-)
              Aber solange ich weder Japanese, Portuguese und English gleich gar nicht verstehe,
              muss ich mich am einzigen deutschen Manual das ich kenne, festhalten.
              Und da steht, ziemlich weit unten, was alles nur wegen der Kompatibilität verwendbar ist.
              Da bleibt nicht wirklich viel übrig ... ;-)

              m.b.G. Rolf