Spojení tabulky se sebou
Sloupec doporucil v tabulce zakaznici obsahuje ID zákazníka, který obchod doporučil. Je to cizí klíč jako každý jiný, jen ukazuje do stejné tabulky: jeden zákazník ukazuje na jiného. Abyste viděli, kdo obchod doporučil komu, potřebujete dva řádky tabulky zakaznici vedle sebe: zákazníka a toho, kdo mu obchod doporučil. Spojíte tedy tabulku zakaznici se sebou samou:
SELECT dop.jmeno AS doporucitel, z.jmeno AS zakaznik
FROM zakaznici AS z
JOIN zakaznici AS dop ON z.doporucil = dop.id
ORDER BY dop.jmeno, z.jmeno;| doporucitel | zakaznik |
|---|---|
| Adéla Králová | Kristýna Fialová |
| Eva Novotná | Jakub Dvořák |
| Eva Novotná | Tereza Svobodová |
| Jakub Dvořák | Tomáš Veselý |
| … | … |
Spojení tabulky se sebou (anglicky self-join) použije stejnou tabulku dvakrát, pod dvěma aliasy, a databáze s nimi zachází jako se dvěma samostatnými tabulkami, které mají shodou okolností stejné řádky. z je zákazník, dop ten, kdo mu obchod doporučil, a ON spáruje každého zákazníka s řádkem, jehož id se rovná jeho doporucil. Aliasy tu nejsou jen kratší: jen jimi můžete říct, kterou z obou kopií myslíte, protože zakaznici.jmeno by mohlo být kterékoli. Dejte jim názvy, které říkají, jakou roli která kopie hraje.
Všechno ostatní funguje jako u každého spojení. Zákazníci, jejichž doporucil je NULL, protějšek nenašli, a tak je JOIN vynechal; LEFT JOIN by je zachoval. A GROUP BY může třeba spočítat, kolik lidí který zákazník do obchodu přivedl.
Tabulku můžete se sebou spojit i podle jiné podmínky než cizího klíče. Které hry mají stejný žánr? Spárujte každou hru s ostatními hrami, jejichž zanr je stejný:
SELECT a.nazev, b.nazev AS stejny_zanr
FROM hry AS a
JOIN hry AS b ON a.zanr = b.zanr AND a.id < b.id
WHERE a.zanr = 'Strategie'
ORDER BY a.nazev, b.nazev;| nazev | stejny_zanr |
|---|---|
| Castle Siege | Galaxy Trader |
| Castle Siege | Tiny Kingdoms |
| Tiny Kingdoms | Galaxy Trader |
a.id < b.id (ON může mít několik podmínek spojených pomocí AND) nechá každou dvojici jen jednou a nikdy nespáruje hru se sebou samou. Bez něj byste dostali Castle Siege s Castle Siege a navíc Castle Siege s Tiny Kingdoms i Tiny Kingdoms s Castle Siege.
Jak psát:
Pokyny
Ukažte každého zákazníka se jménem toho, kdo mu obchod doporučil, včetně zákazníků, kterým ho nikdo nedoporučil: sloupce zakaznik a doporucitel, seřazené podle zakaznik:
| zakaznik | doporucitel |
|---|---|
| Adéla Králová | Tereza Svobodová |
| Anna Kučerová | Tereza Svobodová |
| Eva Novotná | NULL |
| Filip Beneš | NULL |
| … | … |
Pod něj ukažte, kolik zákazníků kdo doporučil: doporucitel a počet jako pocet_doporucenych, jen u těch, kteří někoho doporučili. Seřaďte je podle pocet_doporucenych od nejvyššího, potom podle doporucitel:
| doporucitel | pocet_doporucenych |
|---|---|
| Eva Novotná | 2 |
| Tereza Svobodová | 2 |
| Adéla Králová | 1 |
| Jakub Dvořák | 1 |
| Klára Horáková | 1 |
| Tomáš Veselý | 1 |
A kdo bydlí ve stejném městě jako ten, kdo mu obchod doporučil? Ukažte zakaznik, doporucitel a jejich mesto, seřazené podle zakaznik:
| zakaznik | doporucitel | mesto |
|---|---|---|
| Adéla Králová | Tereza Svobodová | Praha |
| Tereza Svobodová | Eva Novotná | Praha |
| Tomáš Veselý | Jakub Dvořák | Brno |
| Vojtěch Pokorný | Klára Horáková | Plzeň |
Začněte programovat zdarma
10/12