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:
| 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:
SELECT
*
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:
LEFT JOIN users as sons
Nå kan vi spesifisere forbindelsen mellom hovedtabellen og den omdøpte:
LEFT JOIN users as sons ON sons.id=users.son_id
La oss nå spesifisere feltene:
SELECT
users.name as user_name, sons.name as son_name
La oss sette alt sammen og få følgende spørring:
SELECT
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
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.
Skriv en spørring som henter en kategori sammen med dens overordnede kategori.
Skriv en spørring som henter en kategori sammen med dens overordnede kategori og besteforelderkategori.
Skriv en spørring som henter en kategori sammen med dens overordnede kategori, besteforelderkategori og oldeforelderkategori.