Роднасныя сувязі дадзеных у PHP

Хай перад намі стаіць задача захоўваць бацькоў і сыноў. Хай кожны бацька можа мець толькі аднаго сына, а сын у сваю чаргу таксама можа мець аднаго сына.

Трэба прыдумаць, як мы будзем захоўваць дадзеныя. Першая ідэя, якая можа прыйсці ў галаву - зрабіць дзве табліцы: parents для бацькоў і sons для сыноў. Затым звязаць гэтыя табліцы якім-небудзь полем: son_id ці parent_id.

Аднак, гэтая ідэя не вельмі добрая - бо адзін і той жа чалавек можа быць адначасова і бацькам і сынам - і прыйдзецца захоўваць яго ў абодвух табліцах, а гэта нязручна, займае больш месца і лёгка прыводзіць да памылак.

Больш добры варыянт - звязаць табліцу саму з сабой: зробім табліцу users, у ёй будзем захоўваць усіх карыстальнікаў і кожнаму зробім поле son_id, у якім будзе захоўвацца id сына з гэтай жа табліцы:

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

Запыты

Давайце цяпер напішам запыт, які дастане карыстальніка разам з яго сынам.

Для пачатку давайце проста дастанем карыстальнікаў:

sqlSELECT
  *
FROM
  users

Цяпер зджойнім да карыстальнікаў іх сыноў. Джойніць мы будзем табліцу саму да сябе, таму нам трэба выканаць яе перайменаванне:

sqlLEFT JOIN users as sons

Цяпер мы можам указаць сувязь асноўной табліцы і перайменаванай:

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

Укажам цяпер палі:

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

Сабяром усё разам і атрымаем наступны запыт:

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

Практычныя задачы

Задание 1

Хай у нас ёсць катэгорыі. Кожная катэгорыя можа належаць бацькоўскай катэгорыі, тая ў сваю чаргу сваёй бацькоўскай і так далей. Распішыце структуру захоўвання.

Задание 2

Напішыце запыт, які дастане катэгорыю разам з яе бацькоўскай катэгорыяй.

Задание 3

Напішыце запыт, які дастане катэгорыю разам з яе бацькам і прабацькам.

Задание 4

Напішыце запыт, які дастане катэгорыю разам з яе бацькам, прабацькам і прапрабацькам.