Pythonда маълумотларнинг қарндаш алоқалари

Фарз қилайлик, биз оталар ва ўғилларни сақлаш вазифасига эгамиз. Фарз қилайлик, ҳар бир ота фақат битта ўғилга эга бўлиши мумкин, ўғил эса ўзининг навбатида битта ўғилга эга бўлиши мумкин.

Маълумотларни қандай сақлашимизни топшимиз керак. Ёнтилган биринчи фикр - иккита жадвал яратиш: parents оталар учун ва sons ўғиллар учун. Сўнгра бу жадвалларни қандайдир майдон билан боглаш: son_id ёки parent_id.

Бирок, бу фикр жуда яхши эмас - чунки бир хил инсон бир вақтнинг ўзида ҳам ота ҳам ўғил бўлиши мумкин - ва уни ҳар икки жадвалда сақлашга тўғри келади, бу эса қулай эмас, кўпроқ жой олур ва хатоларга осон олиб келур.

Яхшироқ варианти - жадвални ўзи билан боглаш: users жадвалини яратайлик, унда барча фойдаланувчиларни сақлаймиз ва ҳар бирига son_id майдонини яратамиз, унда шу жадвалдан id ўғил сақланади:

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

Сўровлар

Энди фойдаланувчини унинг ўғли билан бирга олиб берадиган сўров язайлик.

>Бошланғич учун фақат фойдаланувчиларни оламиз:

sqlSELECT
  *
FROM
  users

Энди фойдаланувчиларга уларнинг ўғилларини бирлаштирамиз (join). Биз жадвални ўзига бирлаштирамиз, шунинг учун унинг номини ўзгартиришимиз керак:

sqlLEFT JOIN users as sons

Энди асосий жадвал ва номи ўзгартирилган жадвал ўртасидаги алоқани кўрсатишимиз мумкин:

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

Энди майдонларни кўрсатамиз:

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

Ҳаммасини бирлаштирамиз ва куйидаги сўровни оламиз:

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

Амалий вазифалар

Задание 1

Фарз қилайлик, бизда категориялар бор. Ҳар бир категория ота категорияга тегишли бўлиши мумкин, у ўзининг навбатида ўз отасига тегишли ва ҳоказо. Сақлаш тузилмасини ёзиб беринг.

Задание 2

Категорияни унинг ота категорияси билан бирга олиб берадиган сўров язинг.

Задание 3

Категорияни унинг отаси ва бобоси билан бирга олиб берадиган сўров язинг.

Задание 4

Категорияни унинг отаси, бобоси ва бувиси билан бирга олиб берадиган сўров язинг.