Tietojen sukulaissuhteet PHP:ssä

Oletetaan, että edessämme on tehtävä tallentaa isiä ja poikia. Oletetaan, että jokaisella isällä voi olla vain yksi poika, ja poikalla puolestaan myös voi olla yksi poika.

Meidän on keksittävä, kuinka tallennamme tiedot. Ensimmäinen idea, joka voi tulla mieleen - tehdä kaksi taulukkoa: parents isille ja sons pojille. Sitten linkittää nämä taulukot jollakin kentällä: son_id tai parent_id.

Kuitenkaan tämä idea ei ole kovin hyvä - sillä sama henkilö voi olla samanaikaisesti sekä isä että poika - ja hänet on tallennettava molempiin taulukoihin, mikä on hankalaa, vie enemmän tilaa ja johtaa helposti virheisiin.

Parempi vaihtoehto on linkittää taulukko itseensä itsensä kanssa: teemme taulukon users, siihen tallennamme kaikki käyttäjät ja jokaiselle teemme kentän son_id, johon tallennetaan id poika samasta taulukosta:

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

Kyselyt

Kirjoitetaan nyt kysely, joka hakee käyttäjän yhdessä hänen poikansa kanssa.

Aluksi haetaan vain käyttäjät:

sqlSELECT
  *
FROM
  users

Nyt liitämme käyttäjiin heidän poikansa. Liitämme taulukon itseensä itseensä, joten meidän on suoritettava sen nimenmuutos:

sqlLEFT JOIN users as sons

Nyt voimme määrittää päätaulukon ja nimetyn taulukon välisen suhteen:

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

Määritellään nyt kentät:

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

Kootaan kaikki yhteen ja saadaan seuraava kysely:

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

Käytännön tehtävät

Задание 1

Oletetaan, että meillä on kategorioita. Jokainen kategoria voi kuulua yläkategoriaan, se puolestaan omaan yläkategoriaansa ja niin edelleen. Kuvaile tallennusrakenne.

Задание 2

Kirjoita kysely, joka hakee kategorian yhdessä sen yläkategoriansa kanssa.

Задание 3

Kirjoita kysely, joka hakee kategorian yhdessä sen yläkategoriansa ja isoyläkategoriansa kanssa.

Задание 4

Kirjoita kysely, joka hakee kategorian yhdessä sen yläkategoriansa, isoyläkategoriansa ja iso-isoylakategoriansa kanssa.