Родствени врски на податоци во 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
Сега ќе им ги join-неме на корисниците нивните синови. Join ќе ја правиме табелата самата со себе, затоа ни треба да извршиме нејзино преименување:
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
Практични задачи
Нека имаме категории. Секоја категорија може да припаѓа на родителска категорија, таа пак на својата родителска и така натаму. Опишете ја структурата на складирање.
Напишете барање кое ќе ја земе категоријата заедно со нејзината родителска категорија.
Напишете барање кое ќе ја земе категоријата заедно со нејзиниот родител и прародител.
Напишете барање кое ќе ја земе категоријата заедно со нејзиниот родител, прародител и прапрародител.