Datarelaterte forbindelser i PHP

La oss anta at vi står overfor oppgaven med å lagre fedre og sønner. La hver far ha kun én sønn, og sønnen i sin tur kan også ha én sønn.

Vi må finne ut hvordan vi skal lagre dataene. Den første ideen som kan komme til hjernen er å lage to tabeller: parents for fedre og sons for sønner. Deretter koble disse tabellene med et eller annet felt: son_id eller parent_id.

Imidlertid er ikke denne ideen veldig god - for samme person kan samtidig være både far og sønn - og da må vi lagre ham i begge tabellene, noe som er upraktisk, tar opp mer plass og fører lett til feil.

Et bedre alternativ er å koble tabellen til seg selv: la oss lage en tabell users, i den vil vi lagre alle brukere og gi hver en felt son_id, hvor id til sønnen fra samme tabell vil bli lagret:

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

Spørringer

La oss nå skrive en spørring som henter brukeren sammen med sin sønn.

La oss først bare hente brukerne:

sqlSELECT
  *
FROM
  users

La oss nå joine til brukerne deres sønner. Vi vil joine tabellen til seg selv, så vi må utføre dens omdøping:

sqlLEFT JOIN users as sons

Nå kan vi spesifisere forbindelsen mellom hovedtabellen og den omdøpte:

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

La oss nå spesifisere feltene:

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

La oss sette alt sammen og få følgende spørring:

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

Praktiske oppgaver

Задание 1

Anta at vi har kategorier. Hver kategori kan tilhøre en overordnet kategori, og den kan i sin tur tilhøre sin egen overordnede kategori, og så videre. Beskriv lagringsstrukturen.

Задание 2

Skriv en spørring som henter en kategori sammen med dens overordnede kategori.

Задание 3

Skriv en spørring som henter en kategori sammen med dens overordnede kategori og besteforelderkategori.

Задание 4

Skriv en spørring som henter en kategori sammen med dens overordnede kategori, besteforelderkategori og oldeforelderkategori.