Pythonда маълумотларнинг қарндаш алоқалари
Фарз қилайлик, биз оталар ва ўғилларни сақлаш вазифасига эгамиз. Фарз қилайлик, ҳар бир ота фақат битта ўғилга эга бўлиши мумкин, ўғил эса ўзининг навбатида битта ўғилга эга бўлиши мумкин.
Маълумотларни қандай сақлашимизни
топшимиз керак. Ёнтилган биринчи фикр -
иккита жадвал яратиш: parents
оталар учун ва sons ўғиллар учун. Сўнгра
бу жадвалларни қандайдир майдон билан
боглаш: son_id ёки parent_id.
Бирок, бу фикр жуда яхши эмас - чунки бир хил инсон бир вақтнинг ўзида ҳам ота ҳам ўғил бўлиши мумкин - ва уни ҳар икки жадвалда сақлашга тўғри келади, бу эса қулай эмас, кўпроқ жой олур ва хатоларга осон олиб келур.
Яхшироқ варианти - жадвални ўзи билан
боглаш: users жадвалини яратайлик,
унда барча фойдаланувчиларни сақлаймиз ва ҳар бирига
son_id майдонини яратамиз, унда
шу жадвалдан id ўғил сақланади:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Сўровлар
Энди фойдаланувчини унинг ўғли билан бирга олиб берадиган сўров язайлик.
>Бошланғич учун фақат фойдаланувчиларни оламиз:
SELECT
*
FROM
users
Энди фойдаланувчиларга уларнинг ўғилларини бирлаштирамиз (join). Биз жадвални ўзига бирлаштирамиз, шунинг учун унинг номини ўзгартиришимиз керак:
LEFT JOIN users as sons
Энди асосий жадвал ва номи ўзгартирилган жадвал ўртасидаги алоқани кўрсатишимиз мумкин:
LEFT JOIN users as sons ON sons.id=users.son_id
Энди майдонларни кўрсатамиз:
SELECT
users.name as user_name, sons.name as son_name
Ҳаммасини бирлаштирамиз ва куйидаги сўровни оламиз:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Амалий вазифалар
Фарз қилайлик, бизда категориялар бор. Ҳар бир категория ота категорияга тегишли бўлиши мумкин, у ўзининг навбатида ўз отасига тегишли ва ҳоказо. Сақлаш тузилмасини ёзиб беринг.
Категорияни унинг ота категорияси билан бирга олиб берадиган сўров язинг.
Категорияни унинг отаси ва бобоси билан бирга олиб берадиган сўров язинг.
Категорияни унинг отаси, бобоси ва бувиси билан бирга олиб берадиган сўров язинг.