MySQL count Werte mit 0 über ein join

Chimera16

Aktiver Benutzer
Beiträge
26
Hallo Zusammen,

ich führe auf eine Produkttabelle eine Count Abfrage durch:

select Lieferant, count(*) as Anzahl FROM produktlisten.preislisten_lieferanten where Info='' GROUP BY Lieferant ORDER BY Anzahl DESC

Die Abfrage funktioniert wunderbar, allerdings möchte ich auch Lieferanten die 0 passende Einträge haben herausgegeben werden.
Momentan sieht das Ergebnis so aus:
Lieferant A | 1000
Lieferant X | 800
Lieferant F | 430
Lieferant V | 100
Lieferant Q | 3

Ich möchte aber gerne, dass das Ergebnis so aussieht:
Lieferant A | 1000
Lieferant X | 800
Lieferant F | 430
Lieferant V | 100
Lieferant Q | 3
Lieferant P | 0
Lieferant T | 0
Lieferant W | 0

Jetzt ist natürlich klar, dass MySQL ja nicht wissen kann, wie die Namen der anderen Lieferanten sind, wenn Sie in der Tabelle gar nicht enthalten sind. Dafür würde ich gerne einen Join verwenden. In der Tabelle produkte.lieferanten gibt es die Spalte "Namen":

select Name from produkte.lieferanten

Lieferant A
Lieferant F
Lieferant P
Lieferant Q
Lieferant T
Lieferant V
Lieferant W
Lieferant X

Ist es also möglich die ursprüngliche Abfrage "select Lieferant, count(*) as Anzahl FROM produktlisten.preislisten_lieferanten where Info='' GROUP BY Lieferant ORDER BY Anzahl DESC " mit einem join auf produkte.lieferanten.Name zu erweitern, sodass auch die Lieferanten die nicht in der Tabelle enthalten sind aufgeführt werden?

Danke für Eure Hilfe!
 
Zuletzt bearbeitet:
Werbung:
Teste mal:
Code:
SELECT l.Lieferant, sum(CASE WHEN p.Lieferant IS NOT NULL THEN 1 ELSE 0 END) AS Anzahl FROM produkte.lieferanten l LEFT JOIN produktlisten.preislisten_lieferanten p WHERE p.Info='' GROUP BY l.Lieferant ORDER BY Anzahl DESC
 
Hallo Ukulele,

ich bekomme leider einen Syntaxfehler nahe "WHERE p.Info='' GROUP BY l.Lieferant ORDER BY Anzahl DESC"...Kannst du nochmal prüfen ob da was falsch ist? Wenn ich das "Left Join" durch ein Komma ersetzte funktioniert die Abfrage, es wird aber nicht gezählt. Das Feld Anzahl enthält die Summe aller Spalten.

Aber es sind nun zumindest alle Hersteller aufgeführt:

Lieferant A | 448956
Lieferant F | 448956
Lieferant P | 448956
Lieferant Q | 448956
Lieferant T | 448956
Lieferant V | 448956
Lieferant W | 448956
Lieferant X | 448956
 
Zuletzt bearbeitet:
Ja mein Fehler, da fehlt ja was vom Join.
Code:
SELECT l.Lieferant, sum(CASE WHEN p.Lieferant IS NOT NULL THEN 1 ELSE 0 END) AS Anzahl FROM produkte.lieferanten l LEFT JOIN produktlisten.preislisten_lieferanten p ON l.Lieferant = p.Lieferant WHERE p.Info='' GROUP BY l.Lieferant ORDER BY Anzahl DESC
 
Hallo Ukulele,

deine Abfrage ergibt das selbe wie mein Statement oben "select Lieferant, count(*) as Anzahl FROM produktlisten.preislisten_lieferanten where Info='' GROUP BY Lieferant ORDER BY Anzahl DESC".
Es sind nicht die Lieferanten aufgeführt die einen 0 Bestand haben.
 
Ich hatte in Post #2 die ON-Klausel im Join vergessen, die habe ich in Post #4 eingefügt. Dir fehlt die, also hast du vermutlich den falschen Code erwischt.

Ohne ON-Klausel dürfte eigentlich gar kein Ergebnis kommen. Das ist vermutlich einer von vielen MySQL Bugs.
 
Hallo Ukulele,

bei mir geht es nicht. Kannst du dein Statement bitte hier einmal testen? DBFRM, MySQL - rextester
(Ich hoffe ich darf Links posten), unsere beiden Statements stehen unten auskommentiert.. Es kommt bei beidem das Selbe raus. Ich hätte gerne, dass auch Lieferanten mit '0' im Ergebnis sichtbar sind.

Danke dir!
 
Werbung:
Das liegt am WHERE. Bei WHERE
preislisten_lieferanten.Info='' muss ein Datensatz in preislisten_lieferanten existieren daher gibt er die anderen Lieferanten nicht aus. Ich glaube die Einschränkung ist überflüssig aber das kann ich nicht final beantworten.
 
Zurück
Oben