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:
| 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:
SELECT
*
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:
LEFT JOIN users as sons
Nu kan vi ange kopplingen mellan huvudtabellen och den omdöpta tabellen:
LEFT JOIN users as sons ON sons.id=users.son_id
Låt oss nu ange fälten:
SELECT
users.name as user_name, sons.name as son_name
Låt oss sätta ihop allt och få följande fråga:
SELECT
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
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.
Skriv en fråga som hämtar en kategori tillsammans med dess överordnade kategori.
Skriv en fråga som hämtar en kategori tillsammans med dess förälder och farförälder (förförälder).
Skriv en fråga som hämtar en kategori tillsammans med dess förälder, farförälder och farfarförälder.