PHPда маълумотларнинг қардош алоқалари
Фарз қилайлик, бизда оталар ва ўғилларни сақлаш вазифаси турибди. Фарз қилайлик, ҳар бир ота фақат битта ўғилга эга бўлиши мумкин, ўғил эса ўз навбатида битта ўғилга эга бўлиши мумкин.
Маълумотларни қандай сақлашимизни ўйлаб топишимиз керак.
Биринчи бўлиб мимга келадиган фикр
- иккита жадвал яратиш: 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
Амалий вазифалар
Фарз қилайлик, бизда категориялар мавжуд. Ҳар бир категория ота категорияга тегишли бўлиши мумкин, у ўзининг навбатида ўз ота категориясига тегишли ва ҳоказо. Сақлаш тузилмасини ёзиб чиқинг.
Категорияни унинг ота категорияси билан бирга олиб чиқадиган сўров язинг.
Категорияни унинг отаси ва бобоси билан бирга олиб чиқадиган сўров язинг.
Категорияни унинг отаси, бобоси ва бувиси билан бирга олиб чиқадиган сўров язинг.