Príbuzenské väzby dát v PHP

Predpokladajme, že stojíme pred úlohou ukladať otcov a synov. Nech každý otec môže mať len jedného syna a syn naopak tiež môže mať jedného syna.

Musíme vymyslieť, ako budeme dáta ukladať. Prvá myšlienka, ktorá môže napadnúť - vytvoriť dve tabuľky: parents pre otcov a sons pre synov. Potom spojiť tieto tabuľky nejakým poľom: son_id alebo parent_id.

Avšak, táto myšlienka nie je veľmi dobrá - veď rovnaký človek môže byť súčasne aj otcom aj synom - a bude ho treba ukladať v oboch tabuľkách, čo je nepohodlné, zaberá viac miesta a ľahko vedie k chybám.

Lepšia varianta - spojiť tabuľku samu so sebou: vytvoríme tabuľku users, v nej budeme ukladať všetkých používateľov a každému vytvoríme pole son_id, v ktorom sa bude ukladať id syna z tej istej tabuľky:

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

Dopytovanie

Teraz napíšme dopyt, ktorý načíta používateľa spolu s jeho synom.

Na začiatok jednoducho načítajme používateľov:

sqlSELECT
  *
FROM
  users

Teraz pridáme JOIN k používateľom ich synov. JOIN vykonáme tabuľky samej so sebou, preto je potrebné vykonať jej premenovanie:

sqlLEFT JOIN users as sons

Teraz môžeme určiť prepojenie hlavnej tabuľky a premenovanej:

sqlLEFT JOIN users as sons ON sons.id=users.son_id

Teraz určme polia:

sqlSELECT
  users.name as user_name, sons.name as son_name

Spojme všetko dokopy a dostaneme nasledujúci dopyt:

sqlSELECT
  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

Задание 1

Predpokladajme, že máme kategórie. Každá kategória môže patriť nadradenej kategórii, ta naopak svojej nadradenej kategórii a tak ďalej. Popíšte štruktúru ukladania.

Задание 2

Napíšte dopyt, ktorý načíta kategóriu spolu s jej nadradenou kategóriou.

Задание 3

Napíšte dopyt, ktorý načíta kategóriu spolu s jej rodičom a prarodičom.

Задание 4

Napíšte dopyt, ktorý načíta kategóriu spolu s jej rodičom, prarodičom a praprarodičom.