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:
| 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:
SELECT
*
FROM
users
Endi foydalanuvchilarga ularning o‘g‘illarini qo‘shamiz (join). Biz jadvalni o‘ziga bog‘laymiz, shuning uchun uning nomini o‘zgartirishimiz kerak:
LEFT JOIN users as sons
Endi biz 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 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.
Kategoriyani uning ota-ona kategoriyasi bilan birga oladigan so‘rov yozing.
Kategoriyani uning otasi va bobosi bilan birga oladigan so‘rov yozing.
Kategoriyani uning otasi, bobosi va buvasi bilan birga oladigan so‘rov yozing.