Hubungan Data Terkait dalam PHP

Misalkan kita dihadapkan pada tugas untuk menyimpan data ayah dan anak laki-laki. Misalkan setiap ayah hanya dapat memiliki satu anak laki-laki, dan anak laki-laki tersebut pada gilirannya juga dapat memiliki satu anak laki-laki.

Kita perlu memikirkan bagaimana kita akan menyimpan datanya. Ide pertama yang mungkin terlintas di pikiran - adalah membuat dua tabel: parents untuk ayah dan sons untuk anak laki-laki. Kemudian menghubungkan tabel-tabel ini dengan bidang tertentu: son_id atau parent_id.

Namun, ide ini tidak terlalu baik - karena orang yang sama bisa sekaligus menjadi ayah dan anak laki-laki - dan kita harus menyimpannya di kedua tabel, yang mana hal ini tidak nyaman, memakan lebih banyak ruang dan mudah menyebabkan kesalahan.

Varian yang lebih baik - adalah menghubungkan tabel itu sendiri dengan dirinya sendiri: mari buat tabel users, di dalamnya kita akan menyimpan semua pengguna dan untuk setiap pengguna buatkan bidang son_id, yang akan menyimpan id anak laki-laki dari tabel yang sama:

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

Kueri

Sekarang mari kita tulis kueri yang akan mengambil pengguna beserta anak laki-lakinya.

Pertama-tama, mari ambil pengguna saja:

sqlSELECT
  *
FROM
  users

Sekarang mari gabungkan (JOIN) dengan anak laki-laki mereka. Kita akan menggabungkan tabel dengan dirinya sendiri, jadi kita perlu melakukan pengubahan namanya:

sqlLEFT JOIN users as sons

Sekarang kita dapat menentukan hubungan antara tabel utama dan tabel yang telah diubah namanya:

sqlLEFT JOIN users as sons ON sons.id=users.son_id

Sekarang mari tentukan bidang-bidangnya:

sqlSELECT
  users.name as user_name, sons.name as son_name

Mari satukan semuanya dan kita dapatkan kueri berikut:

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

Tugas Praktis

Задание 1

Misalkan kita memiliki kategori. Setiap kategori dapat termasuk dalam kategori induk, kategori induk tersebut pada gilirannya termasuk dalam kategori induknya sendiri dan seterusnya. Jelaskan struktur penyimpanannya.

Задание 2

Tuliskan kueri yang akan mengambil sebuah kategori beserta kategori induknya.

Задание 3

Tuliskan kueri yang akan mengambil sebuah kategori beserta induk dan kakeknya (induk dari induk).

Задание 4

Tuliskan kueri yang akan mengambil sebuah kategori beserta induk, kakek, dan buyutnya (induk dari kakek).