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:

users
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:

sqlSELECT
  *
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:

sqlLEFT JOIN users as sons

Endi asosiy jadval va nomi o'zgartirilgan jadval o'rtasidagi bog'lanishni ko'rsatishimiz mumkin:

sqlLEFT JOIN users as sons ON sons.id=users.son_id

Keling, endi maydonlarni ko'rsatamiz:

sqlSELECT
  users.name as user_name, sons.name as son_name

Hammasini birlashtiramiz va quyidagi so'rovni olamiz:

sqlSELECT
  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

Задание 1

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.

Задание 2

Kategoriyani uning ota kategoriyasi bilan birga olib keladigan so'rov yozing.

Задание 3

Kategoriyani uning otasi va bobosi (parent va grandparent) bilan birga olib keladigan so'rov yozing.

Задание 4

Kategoriyani uning otasi, bobosi va buvisi (parent, grandparent va great-grandparent) bilan birga olib keladigan so'rov yozing.