PHP-те деректердің туыстық байланыстары
Бізде әкелер мен ұлдарды сақтау мәселесі тұрсын. Әр әкеде бір ғана ұл болуы мүмкін, ал ұл өз кезегінде бір ұлға ие болуы мүмкін.
Деректерді қалай сақтайтынымызды ойластыруымыз керек.
Ақылға болатын бірінші идея - екі кесте жасау:
parents әкелер үшін және sons
ұлдар үшін. Содан кейін бұл кестелерді қандай да
бір өріспен байланыстыру: son_id
немесе parent_id.
Бірақ, бұл идея өте жақсы емес - өйткені бір адам бір уақытта hem әке hem де ұл болуы мүмкін - және оны екі кестеде де сақтауға тура келеді, бұл ыңғайсыз, көбірек орын алады және оңай қателіктерге әкеледі.
Жақсы нұсқа - кестені өзімен-өзі байланыстыру:
users кестесін жасайық, онда барлық
пайдаланушыларды сақтаймыз және әрқайсысына
son_id өрісін жасаймыз, онда осы кестенің
id ұлы сақталады:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Сұраныстар
Енді пайдаланушыны оның ұлымен бірге алатын сұраныс жазайық.
Алдымен жай пайдаланушыларды алайық:
SELECT
*
FROM
users
Енді пайдаланушыларға олардың ұлдарын қоса берейік. Біз кестені өзімен-өзі қосамыз, сондықтан оны қайта атау орындау керек:
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
Практикалық есептер
Бізде санаттар бар делік. Әрбір санат аналық санатқа жата алады, ол өз кезегінде өз аналық санатына және т.с.с. Сақтау құрылымын сипаттаңыз.
Санатты оның аналық санатымен бірге алатын сұраныс жазыңыз.
Санатты оның анасы мен әжесімен бірге алатын сұраныс жазыңыз.
Санатты оның анасы, әжесі мен бабасымен бірге алатын сұраныс жазыңыз.