Ilja: Datenbankabfrage

Beitrag lesen

moin,

ich habe mal deine abfrage ein klein wenig formatiert, was man übrigens immer machen sollte. mal von der summe und dein problem abgesehen, hast du ein paar logische fehler in deiner abfrage.

SELECT a.date, a.auftragnr,a.status, a.pausevon, a.pausebis
FROM auftrag a
LEFT JOIN shop_zahlungsarten sz ON a.payment = sz.id
LEFT JOIN auftrag_zahlung az ON az.auftragnr = a.auftragnr
WHERE sz.pay = '1'
AND a.gesamtpreis <= SUM(az.betrag)
AND a.status = '2'
OR sz.pay != '1' AND a.status='2'
ORDER BY a.date
;

1. du machst jeweils einen LEFT JOIN auf zwei tabellen, die du noch in der WHERE klausel bei bedinungen mit einbaust. das macht keinen sinn und ist ein logischer fehler. stell dir vor, der OUTER JOIN hat einen datensatz auftrag, der keinen entsprechenden datensatz in der shop_zahlungsart tabelle hat. dann würde man denken, der auftrag würde trotzdem angezeigt werden, da es sich ja um einen OUTER JOIN auf die tabelle auftrag_zahlung handelt. alle werte der auftrag_zahlungs tabelle würden dann mit NULL werten aufgefüllt werden. und wenn du für die spalte sz.pay den wert NULL hast und mit '1' vergleicht, dann schließt er den datensatz wieder aus. sprich, du hast nur einen gefühlten OUTER JOIN, faktisch machst du einen INNER JOIN.

2. du willst den gesamtpreis aus tabelle auftrag vermutlich nicht mit der gesamten summe aus der tabelle auftrag_zahlung vergleichen, sondern eben nur mit mit der summe, die die gleiche auftragsnummer haben wie der auftrag.

3. es macht heute keinen sinn mehr, in statuswerte so was wie 01, 02, 03, oder 1,2,3 stehen zu haben. das hat man früher sehr oft gemacht, vermutlich um speicherplatz zu sparen. heute solltest du dafür immer sprechende werte nehmen wie zum beispiel NEU, AKTIV, BEENDET.

4. mir ist dieser teil noch unklar: a.gesamtpreis <= SUM(az.betrag) willst du wirklich die werte haben die kleiner sind und die gleich sind oder nur die kleiner sind ?

5. Joins sind oftmals problematisch, man muss sich sehr genau anschauen, was man dabei macht. oftmals verändert sich die anzahl der datensätze ungewollt in der ergebnismenge durch Joins. man muss sich dabei immer genau überlegen, was man tut.

um das zu machen, was du suchst sind wohl korrelierte unterabfragen am besten, was deldfix bereits erwähnte. aber ich würde gerne vorher erst mal wissen, was genau du machen willst, also in worten was für ein ergebnis erwartest du. am besten mit beispiel.

Ilja