Relații de înrudire a datelor în PHP
Să presupunem că avem sarcina de a stoca tați și fii. Să presupunem că fiecare tată poate avea doar un singur fiu, iar fiul la rândul său poate avea și el un singur fiu.
Trebuie să ne gândim cum vom stoca datele.
Prima idee care ne poate veni în minte
- să facem două tabele: parents pentru
tați și sons pentru fii. Apoi să legăm
aceste tabele printr-un câmp oarecare: son_id
sau parent_id.
Cu toate acestea, aceasta nu este o idee foarte bună - pentru că aceeași persoană poate fi simultan și tată și fiu - și va trebui să o stocăm în ambele tabele, ceea ce este incomod, ocupă mai mult spațiu și duce ușor la erori.
O variantă mai bună - este să legăm tabelul cu el
însuși: vom face un tabel users, în
el vom stoca toți utilizatorii și fiecăruia îi vom face
un câmp son_id, în care va fi stocat
id-ul fiului din același tabel:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Interogări
Acum să scriem o interogare care va extrage utilizatorul împreună cu fiul său.
Pentru început, să extragem utilizatorii:
SELECT
*
FROM
users
Acum să facem JOIN utilizatorilor cu fiii lor. Vom face JOIN tabelului cu el însuși, deci avem nevoie să-i facem redenumirea:
LEFT JOIN users as sons
Acum putem specifica legătura dintre tabelul principal și tabelul redenumit:
LEFT JOIN users as sons ON sons.id=users.son_id
Acum să specificăm câmpurile:
SELECT
users.name as user_name, sons.name as son_name
Să punem totul laolaltă și vom obține următoarea interogare:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Sarcini practice
Să presupunem că avem categorii. Fiecare categorie poate aparține unei categorii părinte, aceasta la rândul ei propriului său părinte și așa mai departe. Descrieți structura de stocare.
Scrieți o interogare care va extrage categoria împreună cu categoria sa părinte.
Scrieți o interogare care va extrage categoria împreună cu părintele și bunicul său.
Scrieți o interogare care va extrage categoria împreună cu părintele, bunicul și străbunicul său.