Родственные связи података у PHP-у
Претпоставимо да имамо задатак да чувамо очеве и синове. Претпоставимо да сваки отац може имати само једног сина, а син за узврат такође може имати једног сина.
Потребно је да смислимо како ћемо чувати податке.
Прва идеја која може пасти на памет
- направити две табеле: parents за
очеве и sons за синове. Затим повезати
ове табеле неким пољем: son_id
или parent_id.
Међутим, то није баш добра идеја - јер иста особа може истовремено бити и отац и син - и мораће да се чува у обе табеле, што је непријатно, заузима више простора и лако доводи до грешака.
Боља варијанта је повезивање табеле саме
са собом: направимо табелу users, у
њој ћемо чувати све кориснике и сваком направити
поље son_id, у коме ће се чувати
id сина из исте табеле:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Упити
Хајде сада да напишемо упит који ће извући корисника заједно са његовим сином.
За почеткa хајде да просто извучемо кориснике:
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
Практични задаци
Претпоставимо да имамо категорије. Свака категорија може припадати родитељској категорији, она за узврат својој родитељској и тако даље. Распишите структуру складиштења.
Напишите упит који ће извући категорију заједно са њеном родитељском категоријом.
Напишите упит који ће извући категорију заједно са њеним родитељем и родитељем родитеља.
Напишите упит који ће извући категорију заједно са њеним родитељем, родитељем родитеља и родитељем родитеља родитеља.