Datas släktskapsrelationer i PHP

Antag att vi står inför uppgiften att lagra fäder och söner. Låt varje far bara ha en son, och sonen i sin tur kan också ha en son.

Vi måste komma på hur vi ska lagra data. Den första idén som kan komma att tänka på - skapa två tabeller: parents för fäder och sons för söner. Sedan koppla dessa tabeller med något fält: son_id eller parent_id.

Men det här är inte en särskilt bra idé - för samma person kan samtidigt vara både far och son - och då måste man lagra honom i båda tabellerna, vilket är obekvämt, tar upp mer plats och lätt leder till fel.

Ett bättre alternativ är att koppla tabellen till sig själv: vi skapar en tabell users, i den lagrar vi alla användare och ger varje användare fältet son_id, där id för sonen från samma tabell kommer att lagras:

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

Frågor

Låt oss nu skriva en fråga som hämtar användaren tillsammans med hans son.

Låt oss först bara hämta användarna:

sqlSELECT
  *
FROM
  users

Nu joinar vi användarna med deras söner. Vi kommer att joina tabellen med sig själv, så vi behöver byta namn på den:

sqlLEFT JOIN users as sons

Nu kan vi ange kopplingen mellan huvudtabellen och den omdöpta tabellen:

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

Låt oss nu ange fälten:

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

Låt oss sätta ihop allt och få följande fråga:

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

Praktiska uppgifter

Задание 1

Antag att vi har kategorier. Varje kategori kan tillhöra en överordnad kategori, den i sin tur sin överordnade kategori och så vidare. Beskriv lagringsstrukturen.

Задание 2

Skriv en fråga som hämtar en kategori tillsammans med dess överordnade kategori.

Задание 3

Skriv en fråga som hämtar en kategori tillsammans med dess förälder och farförälder (förförälder).

Задание 4

Skriv en fråga som hämtar en kategori tillsammans med dess förälder, farförälder och farfarförälder.