Příbuzenské vztahy dat v PHP
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 - vždyť stejná osoba může být současně jak otcem, tak synem - a bude ji třeba ukládat v obou tabulkách, což je nepohodlné, zabírá to víc místa a snadno vede k chybám.
Lepší varianta - propojit tabulku samu
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 se bude ukládat
id syna ze stejné tabulky:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Dotazy
Nyní napišme dotaz, který načte uživatele spolu s jeho synem.
Pro začátek načtěme uživatele:
SELECT
*
FROM
users
Nyní připojme k uživatelům jejich syny. Připojovat budeme tabulku samu k sobě, proto je třeba provést její přejmenování:
LEFT JOIN users as sons
Nyní můžeme určit vazbu mezi hlavní tabulkou a přejmenovanou tabulkou:
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 patřit nadřazené kategorii, ta zase své nadřazené kategorii a tak dále. Rozepište strukturu ukládání.
Napište dotaz, který načte kategorii spolu s její nadřazenou kategorií.
Napište dotaz, který načte kategorii spolu s jejím rodičem a prarodičem.
Napište dotaz, který načte kategorii spolu s jejím rodičem, prarodičem a praprarodičem.