Вобастагии додуфарзандӣ дар 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). Ҳамроҳ кардан (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

Дархостеро нависед, ки категорияро бо волидайни он, бобои он ва падарбобои он ба даст орад.