Adatok rokon kapcsolatai PHP-ben
Tegyük fel, hogy az a feladatunk, hogy apákat és fiúkat tároljunk. Tegyük fel, hogy minden apának csak egy fia lehet, a fiúnak pedig viszont szintén lehet egy fia.
Ki kell találnunk, hogyan fogjuk tárolni az adatokat.
Az első ötlet, ami eszünkbe juthat
- készítsünk két táblát: parents az
apáknak és sons a fiúknak. Majd kapcsoljuk össze
ezt a két táblát valamilyen mezővel: son_id
vagy parent_id.
Ez az ötlet azonban nem túl jó - hiszen ugyanaz a személy lehet egyszerre apa és fiú - és mindkét táblában tárolnunk kell, ami kényelmetlen, több helyet foglal és könnyen hibákhoz vezet.
Egy jobb megoldás - kössük össze a táblát önmagával:
készítsünk egy users táblát,
ebben tároljuk az összes felhasználót és mindenkinek készítsünk
egy son_id mezőt, amiben a
fiú id-ja lesz tárolva ugyanebből a táblából:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Lekérdezések
Most írjunk egy lekérdezést, amelyik kiveszi a felhasználót a fiával együtt.
Először egyszerűen vegyük ki a felhasználókat:
SELECT
*
FROM
users
Most csatoljuk (JOIN) hozzá a felhasználókhoz a fiaikat. A csatoláshoz a táblát önmagához fogjuk csatolni, ezért át kell neveznünk:
LEFT JOIN users as sons
Most már megadhatjuk az alap tábla és az átnevezett tábla kapcsolatát:
LEFT JOIN users as sons ON sons.id=users.son_id
Most adjuk meg a mezőket:
SELECT
users.name as user_name, sons.name as son_name
Most rakjuk össze az egészet, és a következő lekérdezést kapjuk:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Gyakorlati feladatok
Tegyük fel, hogy vannak kategóriáink. Minden kategória tartozhat egy szülő kategóriához, az pedig a saját szülő kategóriájához és így tovább. Írja le a tárolás szerkezetét.
Írjon egy lekérdezést, amelyik kiveszi a kategóriát a szülő kategóriájával együtt.
Írjon egy lekérdezést, amelyik kiveszi a kategóriát a szülőjével és a nagyszülőjével együtt.
Írjon egy lekérdezést, amelyik kiveszi a kategóriát a szülőjével, a nagyszülőjével és a dédszülőjével együtt.