PHPda ma'lumotlarning qarindosh aloqalari
Oldimizda otalar va o'g'il bolalarni saqlash vazifasi tursin. Har bir otaning faqat bitta o'g'li bo'lsin, o'g'il esa o'z navbatida bitta o'g'ilga ega bo'lsin.
Ma'lumotlarni qanday saqlashimizni o'ylab topishimiz kerak.
Yigitga keladigan birinchi g'oya - ikkita jadval yaratish:
parents otalar uchun va sons o'g'il bolalar
uchun. Keyin bu jadvallarni qandaydir maydon bilan
bog'lash: son_id yoki parent_id.
Biroq, bu g'oya unchaki yaxshi emas - chunki bir xil shaxs bir vaqtning o'zida ham ota, ham o'g'il bo'lishi mumkin - va uni ikkala jadvalda ham saqlash kerak bo'ladi, bu esa qulay emas, ko'proq joy egallaydi va osonlik bilan xatolarga olib keladi.
Yaxshiroq variant - jadvalni o'zi bilan bog'lash:
users jadvalini yaratamiz, unda barcha
foydalanuvchilarni saqlaymiz va har biriga
son_id maydonini qo'shamiz, unda shu jadvaldagi
o'g'ilning id si saqlanadi:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
So'rovlar
Keling, endi foydalanuvchini uning o'g'li bilan birga olib keladigan so'rov yozamiz.
Boshlash uchun avval foydalanuvchilarni olib kelaylik:
SELECT
*
FROM
users
Endi foydalanuvchilarga ularning o'g'il bolalarini qo'shamiz (join). Biz jadvalni o'ziga bog'laymiz, shuning uchun uning nomini o'zgartirishimiz kerak:
LEFT JOIN users as sons
Endi asosiy jadval va nomi o'zgartirilgan jadval o'rtasidagi bog'lanishni ko'rsatishimiz mumkin:
LEFT JOIN users as sons ON sons.id=users.son_id
Keling, endi maydonlarni ko'rsatamiz:
SELECT
users.name as user_name, sons.name as son_name
Hammasini birlashtiramiz va quyidagi so'rovni olamiz:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Amaliy vazifalar
Faraz qilaylik, bizda kategoriyalar bor. Har bir kategoriya ota kategoriyaga tegishli bo'lishi mumkin, o'z navbatida ota kategoriya o'z ota kategoriyasiga va hokazo. Saqlash tuzilmasini yozib bering.
Kategoriyani uning ota kategoriyasi bilan birga olib keladigan so'rov yozing.
Kategoriyani uning otasi va bobosi (parent va grandparent) bilan birga olib keladigan so'rov yozing.
Kategoriyani uning otasi, bobosi va buvisi (parent, grandparent va great-grandparent) bilan birga olib keladigan so'rov yozing.