Bernd: Unterschiedliche Werte bei der Ausgabe

Hallo,

was ich nicht verstehe ist, warum bekomme ich unterschiedliche Daten ausgelesen wenn ich folgende beide Abfragen starte?

SELECT * 
FROM  `artikel_ausgeliehen` 
WHERE  `aa_artikelID` LIKE  '3ba00ce0c368a8537534fb3aab9af3d1'
AND  `aa_projektID` LIKE  '9e0376a5983764433a9662e917741cdd'
AND  `aa_datum` =  '2019-01-31'

Im oben genannten Code erhalte ich genau einen Datensatz, wie es auch sein soll.

In meiner zweiten Abfrage, die ich eigentlich benötige bekomme ich allerdings 50 Einträge, warum?

SELECT aa_id, aa_artikelID, aa_projektID, aa_menge, aa_datum, aa_status, aa_grund, aa_code,
       p_code, p_titel

FROM artikel_ausgeliehen

LEFT JOIN projekte ON projekte.p_code = artikel_ausgeliehen.aa_projektID
LEFT JOIN artikel_verlust_defekt ON artikel_verlust_defekt.avd_code = artikel_ausgeliehen.aa_code

WHERE aa_datum =  '2019-01-31' AND aa_artikelID =  '3ba00ce0c368a8537534fb3aab9af3d1'

Für den 31.01.2019 und dem ausgewählten Artikel ist nur ein Datensatz vorhanden. Was mache ich im oben genannten Code falsch?

(Edit Rolf B: Code als SQL markiert)

  1. Hallo,

    was ich nicht verstehe ist, warum bekomme ich unterschiedliche Daten ausgelesen wenn ich folgende beide Abfragen starte?

    SELECT * 
    FROM  `artikel_ausgeliehen` 
    WHERE  `aa_artikelID` LIKE  '3ba00ce0c368a8537534fb3aab9af3d1'
    AND  `aa_projektID` LIKE  '9e0376a5983764433a9662e917741cdd'
    AND  `aa_datum` =  '2019-01-31'
    

    Im oben genannten Code erhalte ich genau einen Datensatz, wie es auch sein soll.

    Aber was soll das (teure) LIKE? Warum nicht einfach "="?

    In meiner zweiten Abfrage, die ich eigentlich benötige bekomme ich allerdings 50 Einträge, warum?

    SELECT aa_id, aa_artikelID, aa_projektID, aa_menge, aa_datum, aa_status, aa_grund, aa_code,
           p_code, p_titel
    
    FROM artikel_ausgeliehen
    
    LEFT JOIN projekte ON projekte.p_code = artikel_ausgeliehen.aa_projektID
    LEFT JOIN artikel_verlust_defekt ON artikel_verlust_defekt.avd_code = artikel_ausgeliehen.aa_code
    
    WHERE aa_datum =  '2019-01-31' AND aa_artikelID =  '3ba00ce0c368a8537534fb3aab9af3d1'
    

    Für den 31.01.2019 und dem ausgewählten Artikel ist nur ein Datensatz vorhanden. Was mache ich im oben genannten Code falsch?

    1.)

    "LEFT JOIN funktioniert ähnlich wie INNER JOIN mit dem Unterschied, dass Einträge der linken Tabelle keine Verbindung zu den Daten der rechten Tabelle haben müssen, um selektiert zu werden."

    Bist Du Dir sicher, dass Du einen LEFT JOIN willst?

    2.)

    Wenn Du hier Quelltext markierst, der SQL ist, dann kannst Du hier im Forum ~~~SQL angeben, statt ~~~PHP oder ~~~HTML.

    Im Fall von SQL statt HTML sparst Du sogar einen Tastendruck.

    1. Hallo,

      Aber was soll das (teure) LIKE? Warum nicht einfach "="?

      warum phpMyAdmin hier ein LIKE genommen hat kann ich dir nicht sagen. Ich habe es mir zusammen geklickt.

      "LEFT JOIN funktioniert ähnlich wie INNER JOIN mit dem Unterschied, dass Einträge der linken Tabelle keine Verbindung zu den Daten der rechten Tabelle haben müssen, um selektiert zu werden."

      Bist Du Dir sicher, dass Du einen LEFT JOIN willst?

      Ich habe es gerade mal mit INNER JOIN versucht und es ändert nichts am Ergebnis. Was ich nicht verstehe woher kommen die restlichen 49 Einträge?

      Weder in der Tabelle artikel_verlust_defekt noch in projekte kommt diese Anzahl vor.

      1. Hallo Bernd,

        deine erste Query filtert außer nach Artikel-ID und Datum auch nach Projekt-ID. Hast Du Dich überzeugt, dass es auch ohne die Projekt-ID nur einen Treffer gibt?

        Mal angenommen, dass das so ist. Den Artikel '3ba00ce0c368a8537534fb3aab9af3d1' gibt es zum Stichtag also nur einmal in der DB. In diesem Satz gibt's eine Projekt-ID (also die '9e0376a5983764433a9662e917741cdd') und einen code zum Matching mit avd_code.

        Sei P die Anzahl der Einträge in der Projekte-Tabelle zur Projekt-ID aa_projektID

        Sei A die Anzahl der Einträge in der AVD-Tabelle zum Code aa_code?

        Ich würde mutmaßen, dass A ⋅ P = 50 gilt.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo,

          ich habe den Fehler gefunden, es lag am zweiten LEFT JOIN

          Alt

          SELECT aa_id, aa_artikelID, aa_projektID, aa_menge, aa_datum, aa_status, aa_grund, 
                 aa_code, p_code, p_titel
                          
          FROM artikel_ausgeliehen
          
          LEFT JOIN  projekte ON  projekte.p_code = artikel_ausgeliehen.aa_projektID 
          LEFT JOIN  artikel_verlust_defekt ON  artikel_verlust_defekt.avd_code = artikel_ausgeliehen .aa_code 
          
          WHERE aa_datum='2019-01-31'
          AND aa_artikelID='3ba00ce0c368a8537534fb3aab9af3d1'
          

          Neu

          SELECT aa_id, aa_artikelID, aa_projektID, aa_menge, aa_datum, aa_status, aa_grund, 
                 aa_code, p_code, p_titel
                          
          FROM artikel_ausgeliehen
          
          LEFT JOIN  projekte ON  projekte.p_code = artikel_ausgeliehen.aa_projektID 
          LEFT JOIN  artikel_verlust_defekt ON  artikel_verlust_defekt.avd_code = artikel_ausgeliehen .aa_id 
          
          WHERE aa_datum='2019-01-31'
          AND aa_artikelID='3ba00ce0c368a8537534fb3aab9af3d1'
          

          Das Problem war, nicht jeder Eintrag artikel_ausgeliehen hat einen Code, einen Code haben nur Artikel die von extern kommen, damit kann ich diese unterscheiden.