Gewünscht, aber nicht gekauft
Jetzt beginnt die Wunschliste, Geld zu verdienen. Nächste Woche will der Shop jedem, der ein Spiel auf seiner Wunschliste hat, es aber nicht gekauft hat, ein Rabattangebot schicken: „Ein Spiel von deiner Wunschliste ist 20 % günstiger!“ Manche Kunden haben ein Spiel, das sie sich gewünscht haben, inzwischen gekauft, und ein Angebot dafür würde sie nur ärgern.
Was bedeutet „nicht gekauft“ genau? Dass es keine bezahlte Bestellung dieses Kunden gibt, in der dieses Spiel steckt. Eine erstattete Bestellung zählt nicht: Jonas Hartmann hat Shadow Ninja gekauft, aber zurückgegeben, also kann er trotzdem ein Angebot bekommen. Und ein Angebot ergibt nur für Spiele Sinn, die schon erschienen sind: Robot Rebellion oder Mystery Manor kann noch niemand kaufen.
„Es gibt keine Zeile, sodass …“ ist ein Fall für NOT EXISTS. Für jede Zeile der äußeren Abfrage führt die Datenbank die Unterabfrage aus, und NOT EXISTS behält die Zeile, wenn die Unterabfrage nichts findet. Die Unterabfrage verwendet Spalten der äußeren Zeile, es ist also eine korrelierte Unterabfrage. Zum Beispiel die Kunden, die noch keine einzige Bewertung geschrieben haben:
SELECT k.name
FROM kunden AS k
WHERE NOT EXISTS (
SELECT *
FROM bewertungen AS r
WHERE r.kunde_id = k.id
)
ORDER BY k.name;| name |
|---|
| Hannes Schulz |
| Max Krause |
In deiner Abfrage sucht die Unterabfrage nach einer Bestellung desselben Kunden (b.kunde_id = w.kunde_id) mit demselben Spiel (p.spiel_id = w.spiel_id), die bezahlt ist. Der Kunde und der Status stehen in bestellungen, das Spiel steht in positionen, also verbindet die Unterabfrage diese beiden Tabellen.
Typischer Fehler: eine der Bedingungen wegzulassen, die die Unterabfrage mit der äußeren Zeile verbinden. Ohne b.kunde_id = w.kunde_id fragt die Unterabfrage, ob überhaupt irgendjemand das Spiel gekauft hat, und Lukas Neumann bekommt kein Angebot für Knight's Oath, nur weil Emma Becker es gekauft hat.
So schreibst du es:
Anweisungen
- 1
Schreibe unter dem Kommentar
-- 4. Gewünscht, aber nicht gekauftdie Liste für die Angebote: den Namen und die E-Mail-Adresse des Kunden und den Titel des Spiels (die Spaltenname,emailundtitel) jedes Wunsches, dessen Spiel schon erschienen ist (erschienenist nichtNULL) und das der Kunde nicht in einer bezahlten Bestellung gekauft hat. Sortiere sie nach dem Namen und dann nach dem Titel. Das sind alle 7 Angebote:name email titel Anna Fischer anna.fischer@mail.de Star Pilots Emma Becker emma.becker@mail.de Goal Rush Ida Zimmermann ida.zimmermann@mail.de Dragon Forge Jonas Hartmann jonas@hartmann.io Shadow Ninja Lukas Neumann lukas.neumann@mail.de Knight's Oath Max Krause max.krause@mail.de Goal Rush Oskar Klein oskar.klein@mail.de Knight's Oath - 2
Und zum Vergleich die Wünsche, die in Erfüllung gegangen sind: die Wünsche, deren Spiel der Kunde in einer bezahlten Bestellung gekauft hat. Zeige die Spalten
nameundtitel, genauso sortiert:name titel Anna Fischer Dragon Forge Olivia Braun Knight's Oath Sophie Arnold Zombie Town