Srodničke veze podataka u PHP
Pretpostavimo da smo suočeni sa zadatkom čuvanja očeva i sinova. Neka svaki otac može imati samo jednog sina, a sin zauzvrat takođe može imati jednog sina.
Potrebno je smisliti kako ćemo čuvati podatke.
Prva ideja koja može pasti na pamet
je napraviti dve tabele: parents za
očeve i sons za sinove. Zatim povezati
ove tabele nekim poljem: son_id
ili parent_id.
Međutim, ova ideja nije baš dobra - jer ista osoba može istovremeno biti i otac i sin - i moralo bi se da čuva u obe tabele, a to je nepraktično, zauzima više mesta i lako vodi greškama.
Bolja varijanta je povezivanje tabele same
sa sobom: napravićemo tabelu users, u
joj ćemo čuvati sve korisnike i svakom ćemo napraviti
polje son_id, u kojem će se čuvati
id sina iz ove iste tabele:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Upiti
Sada napišimo upit koji će izvući korisnika zajedno sa njegovim sinom.
Za početak, hajde da jednostavno izvučemo korisnike:
SELECT
*
FROM
users
Sada ćemo pridružiti korisnicima njihove sinove. Pridruživanje ćemo vršiti tabele same sa sobom, pa nam treba izvršiti njeno preimenovanje:
LEFT JOIN users as sons
Sada možemo navesti vezu osnovne tabele i preimenovane:
LEFT JOIN users as sons ON sons.id=users.son_id
Hajde da sada navedemo polja:
SELECT
users.name as user_name, sons.name as son_name
Sastavimo sve zajedno i dobićemo sledeći upit:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Praktični zadaci
Neka imamo kategorije. Svaka kategorija može pripadati roditeljskoj kategoriji, ona zauzvrat svojoj roditeljskoj i tako dalje. Opišite strukturu čuvanja.
Napišite upit koji će izvući kategoriju zajedno sa njenom roditeljskom kategorijom.
Napišite upit koji će izvući kategoriju zajedno sa njenim roditeljem i roditeljem roditelja.
Napišite upit koji će izvući kategoriju zajedno sa njenim roditeljem, roditeljem roditelja i roditeljem roditelja roditelja.