Роднасныя сувязі дадзеных у PHP
Хай перад намі стаіць задача захоўваць бацькоў і сыноў. Хай кожны бацька можа мець толькі аднаго сына, а сын у сваю чаргу таксама можа мець аднаго сына.
Трэба прыдумаць, як мы будзем захоўваць дадзеныя.
Першая ідэя, якая можа прыйсці ў галаву
- зрабіць дзве табліцы: parents для
бацькоў і sons для сыноў. Затым звязаць
гэтыя табліцы якім-небудзь полем: son_id
ці parent_id.
Аднак, гэтая ідэя не вельмі добрая - бо адзін і той жа чалавек можа быць адначасова і бацькам і сынам - і прыйдзецца захоўваць яго ў абодвух табліцах, а гэта нязручна, займае больш месца і лёгка прыводзіць да памылак.
Больш добры варыянт - звязаць табліцу саму
з сабой: зробім табліцу users, у
ёй будзем захоўваць усіх карыстальнікаў і кожнаму зробім
поле son_id, у якім будзе захоўвацца
id сына з гэтай жа табліцы:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Запыты
Давайце цяпер напішам запыт, які дастане карыстальніка разам з яго сынам.
Для пачатку давайце проста дастанем карыстальнікаў:
SELECT
*
FROM
users
Цяпер зджойнім да карыстальнікаў іх сыноў. Джойніць мы будзем табліцу саму да сябе, таму нам трэба выканаць яе перайменаванне:
LEFT JOIN users as sons
Цяпер мы можам указаць сувязь асноўной табліцы і перайменаванай:
LEFT JOIN users as sons ON sons.id=users.son_id
Укажам цяпер палі:
SELECT
users.name as user_name, sons.name as son_name
Сабяром усё разам і атрымаем наступны запыт:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Практычныя задачы
Хай у нас ёсць катэгорыі. Кожная катэгорыя можа належаць бацькоўскай катэгорыі, тая ў сваю чаргу сваёй бацькоўскай і так далей. Распішыце структуру захоўвання.
Напішыце запыт, які дастане катэгорыю разам з яе бацькоўскай катэгорыяй.
Напішыце запыт, які дастане катэгорыю разам з яе бацькам і прабацькам.
Напішыце запыт, які дастане катэгорыю разам з яе бацькам, прабацькам і прапрабацькам.