Pythonda Ma'lumotlarning Qarindosh Bog‘lanishlari

Faraz qilaylik, bizning oldimizda otalar va o‘g‘illarni saqlash vazifasi turibdi. Faraz qilaylik, har bir ota faqat bitta o‘g‘ilga ega bo‘lishi mumkin, o‘g‘il esa o‘z navbatida bitta o‘g‘ilga ega bo‘lishi mumkin.

Ma'lumotlarni qanday saqlashimizni o‘ylab topishimiz kerak. Boshga kelgan birinchi g‘oya - ikki jadval yaratish: parents otalar uchun va sons o‘g‘illar uchun. Keyin bu jadvallarni qandaydir maydon bilan bog‘lash: son_id yoki parent_id.

Biroq, bu g‘oya unchali yaxshi emas - chunki o‘sha bir odul bir vaqtning o‘zida ham ota, ham o‘g‘il bo‘lishi mumkin - va uni ikkala jadvalda ham saqlashga to‘g‘ri keladi, bu esa qulay emas, ko‘proq joy egallaydi va xatolarga olib kelishi oson.

Yanada yaxshi variant - jadvalni o‘zi bilan bog‘lash: users jadvalini yaratamiz, unda barcha foydalanuvchilarni saqlaymiz va har biriga son_id maydonini qo‘shamiz, unda o‘sha jadvaldagi o‘g‘ilning id 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 oladigan so‘rov yozamiz.

Boshlash uchun keling, shunchaki foydalanuvchilarni olaylik:

sqlSELECT
  *
FROM
  users

Endi foydalanuvchilarga ularning o‘g‘illarini qo‘shamiz (join). Biz jadvalni o‘ziga bog‘laymiz, shuning uchun uning nomini o‘zgartirishimiz kerak:

sqlLEFT JOIN users as sons

Endi biz 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 mavjud. Har bir kategoriya ota-ona kategoriyasiga tegishli bo‘lishi mumkin, o‘sha kategoriya esa o‘z navbatida o‘zining ota-ona kategoriyasiga va hokazo. Saqlesh tuzilishini yozing.

Задание 2

Kategoriyani uning ota-ona kategoriyasi bilan birga oladigan so‘rov yozing.

Задание 3

Kategoriyani uning otasi va bobosi bilan birga oladigan so‘rov yozing.

Задание 4

Kategoriyani uning otasi, bobosi va buvasi bilan birga oladigan so‘rov yozing.