Poddotazy jako sloupce
Poddotaz může být i sloupcem výsledku. Kolik recenzí má každá hra?
SELECT h.nazev,
(SELECT COUNT(*) FROM recenze AS r WHERE r.hra_id = h.id) AS pocet_recenzi
FROM hry AS h
ORDER BY pocet_recenzi DESC, h.nazev;| nazev | pocet_recenzi |
|---|---|
| Dragon Forge | 4 |
| Cube Logic | 2 |
| Knight's Oath | 2 |
| Moon Farm | 2 |
| … | … |
Poddotaz je korelovaný, stejně jako ty s EXISTS: odkazuje se na h.id, hru z řádku vnějšího dotazu. Pro každou hru databáze spočítá recenze s jejím ID a číslo dá do sloupce pocet_recenzi. Castle Siege a další hry bez recenze dostanou 0, protože COUNT(*) z žádných řádků je 0.
Poddotaz v SELECT musí pro každý řádek dát jednu hodnotu: musí vracet jeden sloupec a měl by najít nejvýš jeden řádek (z několika by SQLite potichu vzalo první), takže to bývá agregační funkce. Když nenajde žádný řádek, je hodnota NULL. A sloupci dejte alias, jinak se bude jmenovat celým textem poddotazu.
Počítat umíte i jinak: pomocí LEFT JOIN s GROUP BY a COUNT(r.hvezdicky) ze 6. lekce. Obojí dá stejný výsledek. Poddotaz se hodí, když potřebujete víc čísel z různých tabulek: každý poddotaz počítá sám za sebe, takže se řádky nenásobí tak jako tehdy, když ke hrám připojíte zároveň recenze i polozky (jedna ze záludností spojování z 6. lekce).
Typická chyba: zapomenout na podmínku, která poddotaz spojuje s řádkem. (SELECT COUNT(*) FROM recenze) spočítá všechny recenze v tabulce, takže by u každé hry bylo 25.
Jak psát:
Pokyny
Pro každého zákazníka ukažte jméno a datum jeho poslední objednávky jako posledni_objednavka. Použijte poddotaz v SELECT, který najde nejpozdější datum objednávek zákazníka. Seřaďte podle jména:
| jmeno | posledni_objednavka |
|---|---|
| Adéla Králová | 2025-09-27 |
| Anna Kučerová | 2025-04-15 |
| Eva Novotná | 2025-11-14 |
| Filip Beneš | NULL |
| … | … |
Filip Beneš a Martin Zeman si nikdy nic neobjednali, takže mají ve sloupci posledni_objednavka hodnotu NULL. Ukažte místo ní text nikdy: dejte celý poddotaz do COALESCE(). Výsledek pak začíná takto:
| jmeno | posledni_objednavka |
|---|---|
| Adéla Králová | 2025-09-27 |
| Anna Kučerová | 2025-04-15 |
| Eva Novotná | 2025-11-14 |
| Filip Beneš | nikdy |
| … | … |
Pod to ukažte pro každou hru její název, počet kusů, které si zákazníci objednali, jako kusy (součet sloupce pocet v tabulce polozky), a průměrný počet hvězdiček zaokrouhlený na jedno desetinné místo jako hodnoceni. Budete potřebovat dva poddotazy. Seřaďte podle názvu:
| nazev | kusy | hodnoceni |
|---|---|---|
| Bakery Story | 3 | 4.0 |
| Castle Siege | 1 | NULL |
| Cube Logic | 3 | 4.0 |
| Dragon Forge | 4 | 4.3 |
| … | … | … |
Začněte programovat zdarma
5/8