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;
doporucitelzakaznik
Adéla KrálováKristýna Fialová
Eva NovotnáJakub Dvořák
Eva NovotnáTereza Svobodová
Jakub DvořákTomáš 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;
nazevstejny_zanr
Castle SiegeGalaxy Trader
Castle SiegeTiny Kingdoms
Tiny KingdomsGalaxy 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.

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:

zakaznikdoporucitel
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:

doporucitelpocet_doporucenych
Eva Novotná2
Tereza Svobodová2
Adéla Králová1
Jakub Dvořák1
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:

zakaznikdoporucitelmesto
Adéla KrálováTereza SvobodováPraha
Tereza SvobodováEva NovotnáPraha
Tomáš VeselýJakub DvořákBrno
Vojtěch PokornýKlára HorákováPlzeň

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

10/12