Andmete sugulussidemed PHP-s

Oletame, et seisame silmitsi ülesandega salvestada isasid ja poegi. Oletame, et iga isa võib omada ainult ühte poega ja poeg omakorda võib samuti omada ühte poega.

Peame välja mõtlema, kuidas me andmeid salvestame. Esimene idee, mis pähe võib tulla - teha kaks tabelit: parents (isadele) ja sons (poegadele). Seejärel linkida need tabelid mingi väljaga: son_id või parent_id.

Siiski, see idee pole eriti hea - sest sama inimene võib olla samaaegselt nii isa kui poeg - ja tuleb teda salvestada mõlemasse tabelisse, mis on ebamugav, võtab rohkem ruumi ja viib kergesti vigadeni.

Parem variant on siduda tabel iseendaga: teeme tabeli users, salvestame sinna kõik kasutajad ja teeme igaühele välja son_id, kuhu salvestatakse id pojast samast tabelist:

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

Päringud

Kirjutame nüüd päringu, mis toob kasutaja koos tema pojaga.

Alustuseks toome lihtsalt kasutajad:

sqlSELECT
  *
FROM
  users

Nüüd ühendame (join) kasutajatele nende pojad. Ühendame tabeli iseendaga, seega peame tegema selle ümbernimetamise:

sqlLEFT JOIN users as sons

Nüüd saame määrata põhitabeli ja ümbernimetatud tabeli vahelise seose:

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

Määrame nüüd väljad:

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

Paneme kõik kokku ja saame järgmise päringu:

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

Praktilised ülesanded

Задание 1

Oletame, et meil on kategooriad. Iga kategooria võib kuuluda vanemkategooriasse, see omakorda oma vanemkategooriasse ja nii edasi. Kirjeldage salvestusstruktuuri.

Задание 2

Kirjutage päring, mis toob kategooria koos selle vanemkategooriaga.

Задание 3

Kirjutage päring, mis toob kategooria koos selle vanemaga ja vanavanemaga.

Задание 4

Kirjutage päring, mis toob kategooria koos selle vanemaga, vanavanemaga ja vanavanavanemaga.