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

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

Маълумотларни қандай сақлашимизни ўйлаб топишимиз керак. Биринчи бўлиб мимга келадиган фикр - иккита жадвал яратиш: 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

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