Unterschiedliche Werte bei der Ausgabe
Bernd
- datenbank
- php
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)
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.
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.
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
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.