Přejí si, ale nekoupili
Teď začne seznam přání vydělávat. Příští týden chce obchod poslat slevovou nabídku každému, kdo má nějakou hru v seznamu přání, ale nekoupil si ji: „Hra z vašeho seznamu přání je o 20 % levnější!“ Někteří zákazníci si hru, kterou si přáli, mezitím koupili, a nabídka by je jen otravovala.
Co přesně znamená „nekoupil si ji“? Že neexistuje žádná zaplacená objednávka tohoto zákazníka, ve které tato hra je. Vrácená objednávka se nepočítá: Tomáš Veselý si hru Shadow Ninja koupil, ale vrátil ji, takže nabídku dostat může. A nabídka má smysl jen u her, které už vyšly: Robot Rebellion ani Mystery Manor si zatím nikdo koupit nemůže.
„Neexistuje řádek, pro který…“ je práce pro NOT EXISTS. Databáze pro každý řádek vnějšího dotazu provede poddotaz a NOT EXISTS řádek ponechá, když poddotaz nic nenajde. Poddotaz používá sloupce vnějšího řádku, je to tedy korelovaný poddotaz. Například zákazníci, kteří nenapsali ani jednu recenzi:
SELECT z.jmeno
FROM zakaznici AS z
WHERE NOT EXISTS (
SELECT *
FROM recenze AS r
WHERE r.zakaznik_id = z.id
)
ORDER BY z.jmeno;| jmeno |
|---|
| Filip Beneš |
| Martin Zeman |
Ve vašem dotazu hledá poddotaz zaplacenou objednávku téhož zákazníka (o.zakaznik_id = sp.zakaznik_id) s touž hrou (p.hra_id = sp.hra_id). Zákazník a stav jsou v tabulce objednavky, hra v tabulce polozky, takže poddotaz tyto dvě tabulky spojí.
Typická chyba: vynechat jednu z podmínek, které poddotaz vážou k vnějšímu řádku. Bez o.zakaznik_id = sp.zakaznik_id se poddotaz ptá, jestli si hru koupil vůbec někdo, a Jakub Dvořák nedostane nabídku na Knight's Oath jen proto, že si ji koupila Eva Novotná.
Jak psát:
Pokyny
Pod komentář -- 4. Přejí si, ale nekoupili napište seznam pro nabídky: jméno a e-mail zákazníka a název hry (sloupce jmeno, email a nazev) u každého přání, jehož hra už vyšla (vydano není NULL) a které si zákazník nekoupil v zaplacené objednávce. Seřaďte ho podle jména a pak podle názvu. Tohle je všech 7 nabídek:
| jmeno | nazev | |
|---|---|---|
| Anna Kučerová | anna.kucerova@mail.cz | Star Pilots |
| Eva Novotná | eva.novotna@mail.cz | Goal Rush |
| Jakub Dvořák | jakub.d@mail.cz | Knight's Oath |
| Martin Zeman | martin.zeman@mail.cz | Goal Rush |
| Natálie Marková | natalie.markova@mail.cz | Dragon Forge |
| Tomáš Veselý | tomas@vesely.cz | Shadow Ninja |
| Vojtěch Pokorný | vojtech.pokorny@mail.cz | Knight's Oath |
A pro srovnání přání, která se splnila: přání, jejichž hru si zákazník koupil v zaplacené objednávce. Ukažte sloupce jmeno a nazev, seřazené stejně:
| jmeno | nazev |
|---|---|
| Anna Kučerová | Dragon Forge |
| Kristýna Fialová | Zombie Town |
| Tereza Svobodová | Knight's Oath |
Začněte programovat zdarma
4/6