Vztahy mezi daty v Pythonu
Předpokládejme, že stojíme před úkolem ukládat otce a syny. Předpokládejme, že každý otec může mít pouze jednoho syna a syn naopak také může mít jednoho syna.
Je třeba vymyslet, jak budeme data
ukládat. První nápad, který může přijít
na mysl - vytvořit dvě tabulky: parents
pro otce a sons pro syny. Poté
propojit tyto tabulky nějakým polem:
son_id nebo parent_id.
To však není moc dobrý nápad - protože stejná osoba může být současně jak otcem, tak synem - a bylo by nutné ji ukládat v obou tabulkách, což je nepohodlné, zabírá víc místa a snadno vede k chybám.
Lepší varianta - propojit tabulku
samou se sebou: vytvoříme tabulku users,
budeme v ní ukládat všechny uživatele a každému
vytvoříme pole son_id, ve kterém bude
uloženo id syna ze stejné tabulky:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Dotazy
Nyní napišme dotaz, který získá uživatele spolu s jeho synem.
Pro začátek jednoduše získejme uživatele:
SELECT
*
FROM
users
Nyní připojme k uživatelům jejich syny. Připojovat budeme tabulku samu k sobě, proto je nutné provést její přejmenování:
LEFT JOIN users as sons
Nyní můžeme určit vazbu mezi hlavní tabulkou a přejmenovanou:
LEFT JOIN users as sons ON sons.id=users.son_id
Nyní určeme pole:
SELECT
users.name as user_name, sons.name as son_name
Vše spojme dohromady a získáme následující dotaz:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Praktické úlohy
Předpokládejme, že máme kategorie. Každá kategorie může náležet nadřazené kategorii, ta zase své nadřazené kategorii a tak dále. Popište strukturu ukládání.
Napište dotaz, který získá kategorii spolu s její nadřazenou kategorií.
Napište dotaz, který získá kategorii spolu s jejím rodičem a prarodičem.
Napište dotaz, který získá kategorii spolu s jejím rodičem, prarodičem a praprarodičem.