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:

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

sqlSELECT
  *
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:

sqlLEFT JOIN users as sons

Acum putem specifica legătura dintre tabelul principal și tabelul redenumit:

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

Acum să specificăm câmpurile:

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

Să punem totul laolaltă și vom obține următoarea interogare:

sqlSELECT
  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

Задание 1

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.

Задание 2

Scrieți o interogare care va extrage categoria împreună cu categoria sa părinte.

Задание 3

Scrieți o interogare care va extrage categoria împreună cu părintele și bunicul său.

Задание 4

Scrieți o interogare care va extrage categoria împreună cu părintele, bunicul și străbunicul său.