PHP-те деректердің туыстық байланыстары

Бізде әкелер мен ұлдарды сақтау мәселесі тұрсын. Әр әкеде бір ғана ұл болуы мүмкін, ал ұл өз кезегінде бір ұлға ие болуы мүмкін.

Деректерді қалай сақтайтынымызды ойластыруымыз керек. Ақылға болатын бірінші идея - екі кесте жасау: parents әкелер үшін және sons ұлдар үшін. Содан кейін бұл кестелерді қандай да бір өріспен байланыстыру: son_id немесе parent_id.

Бірақ, бұл идея өте жақсы емес - өйткені бір адам бір уақытта hem әке hem де ұл болуы мүмкін - және оны екі кестеде де сақтауға тура келеді, бұл ыңғайсыз, көбірек орын алады және оңай қателіктерге әкеледі.

Жақсы нұсқа - кестені өзімен-өзі байланыстыру: users кестесін жасайық, онда барлық пайдаланушыларды сақтаймыз және әрқайсысына son_id өрісін жасаймыз, онда осы кестенің id ұлы сақталады:

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

Сұраныстар

Енді пайдаланушыны оның ұлымен бірге алатын сұраныс жазайық.

Алдымен жай пайдаланушыларды алайық:

sqlSELECT
  *
FROM
  users

Енді пайдаланушыларға олардың ұлдарын қоса берейік. Біз кестені өзімен-өзі қосамыз, сондықтан оны қайта атау орындау керек:

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

Санатты оның анасы, әжесі мен бабасымен бірге алатын сұраныс жазыңыз.