[MySQL] Abfrage mit Joins. Möchte e Aktionsartikel anzeigen, aber noch nie bestellt

thesle

Grünschnabel
Bin leider kein SQL spezi und schon dem Verzeifeln nahe. Habe vieles versucht, gelesen und keine Lösung gefunden. Jeder Hinweis ist mir willkommen.

Problem: Möchte eine Liste der Aktionsartikel anzeigen, die der Kunde nicht schon bestellt hat. (Ein Artikel kann nur einmal vom gleichen Kunden bestellt werden).

TABELLEN:
artikel
id, bezeichnung ...
1 aaaaa
2 bbbb
3 ccccc
4 dddd

aktionen
id, status ...
1 1
2 1
4 1

bestellt
id, kunden-nr
1 10
1 11
1 12
2 12

Wenn ich nun Kunden-Nr 12 habe, so kann ich den Artikel 1 nicht aus der Tabelle ausschliessen, da dieser auch mit Kunden-nr 10 + 11 zurückgegeben wird.

So weit bin ich
SQL:
SELECT DISTINCT artikel.bezeichnung, artikel.id, bestellt.kunden-nr
FROM artikel
JOIN aktionen ON artikel.id = aktionen.id
LEFT JOIN bestellt ON artikel.id = bestellt.id
WHERE aktionen.status 1 AND bestellt.kunden-nr <> 'Kd-nr.'

Danke, Thesle
 
Zuletzt bearbeitet von einem Moderator:
Hey Thesle,

ich verstehe noch nicht ganz was dein Problem ist wahrscheinlich. So wie ich das verstehe, willst du für einen bestimmten Kunden alle Aktionsartikel anzeigen, die er noch nicht bestllt hat, richtig?
Warum kannst du dann nicht Artikel 1 ausschließen? Klar du darfst ihn nicht löschen eben weil Kunde 10 und 11 ihn noch angezeigt bekommen müssen, aber wenn die ihre Aktionsartikel angezeigt bekommen ist das ja auch eine andere Abfrage. Weil dann wird für Kd-nr. 11 oder 10 genommen und nicht 12.
Hoffe du kannst mir sagen wo mein Denkfehler ist, damit ich dir helfen kann.

Schöne Grüße,
Mainz007
 
Vorschlag:

Code:
SELECT DISTINCT artikel.bezeichnung, artikel.id, bestellt.kunden-nr
FROM artikel
JOIN aktionen ON artikel.id = aktionen.id
LEFT JOIN bestellt ON artikel.id = bestellt.id AND bestellt.kunden-nr = 'Kd-nr.'
WHERE aktionen.STATUS 1 AND bestellt.id IS NULL
 
Danke für den Vorschlag. Den habe ich wie in meiner Anfrage erwähnt bereits versucht. Das Problem ist, dass ich dann jene Artikel, die irgend ein anderer Kunde für sich bestellt hat auch nicht mehr zu sehen bekomme.
 
SELECT DISTINCT artikel.bezeichnung, artikel.id
FROM artikel
LEFT JOIN aktionen ON artikel.id = aktionen.id
LEFT JOIN bestellt ON artikel.id = bestellt.id
WHERE bestellt.kunden-nr <> 'Kd-nr.' AND aktionen.Status = 1

Bekommst so nicht alle Artikel für die es eine Aktion gibt und von dem gewählten Kunden noch nicht bestellt wurden(?)

Fohnbit
 
Nein habe 4 artikel in Aktion
aaa
bbb
ddd
eee
Kunde 6 hat aaa bestellt
Kunde 4 hat aaa und bbb bestellt
Mit der vorgeschlagenen query erhält Kunde 6 nun die Artikel
aaa
bbb
zur Auswahl zurück, ob wohl aaa bereits bestellt wurde und ddd und eee sieht er gar nicht.
 
SQL:
SELECT
	a.*
FROM
	artikel AS a
	LEFT JOIN bestellt as b
		ON a.id = b.id
WHERE
	b.id IS NULL
	AND b.`kunden-nr` = 12

oder
SQL:
SELECT
	a.*
FROM
	artikel AS a
WHERE
	a.id NOT IN (
		SELECT b.id 
		FROM bestellt AS b 
		WHERE b.`kunden-nr` = 12)
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück