Родствени връзки на данни в 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
Практически задачи
Да предположим, че имаме категории. Всяка категория може да принадлежи на родителска категория, тя от своя страна на своя родителска и така нататък. Описете структурата на съхранение.
Напишете заявка, която ще извлече категория заедно с нейната родителска категория.
Напишете заявка, която ще извлече категория заедно с нейния родител и прародител.
Напишете заявка, която ще извлече категория заедно с нейния родител, прародител и прапрародител.