Дар 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) мекунем. Ба ҷадвал худ ба худ ҳамроҳи (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
Масъалаҳои амалӣ
Фарз мекунем, ки мо гурӯҳҳо (категорияҳо) дорем. Ҳар гурӯҳ метавонад ба гурӯҳи волидайн тааллуқ дошта бошад, он худ ба гурӯҳи волидайни худ ва ҳамин тавр. Сохти нигоҳдориро тавсиф кунед.
Дархостеро нависед, ки гурӯҳро бо гурӯҳи волидайни он мегирад.
Дархостеро нависед, ки гурӯҳро бо волидайн ва бобои он мегирад.
Дархостеро нависед, ки гурӯҳро бо волидайн, бобо ва бобобобои он мегирад.