Andmete hankimine seotud tabelitest PHP-s

Teeme päringu, mis toob kõik kasutajad koos nende linnadega. Selleks vajame käsku LEFT JOIN:

Selle süntaks on järgmine:

sqlSELECT väljad FROM tabeli_nimi
  LEFT JOIN seotud_tabeli_nimi ON seosingutingimus 
WHERE valikutingimus

Vaatame üle selle käsu süntaksi üksikosad.

Väljad

Kuna valik tehakse mitmest tabelist, siis kõigi väljade valimine läbi * ei toimi. Järgmine päring valib väljad ainult põhitabelist, mitte seotud tabelist:

sqlSELECT *

Selleks, et andmeid kõigist tabelitest valitaks, tuleb enne * määrata tabeli nimi, millest valida:

sqlSELECT users.*, cities.*

Või saab loetleda vajalikud väljad koos nende ees oleva tabeli nimega:

sqlSELECT users.name, cities.name

Neil kahel viisil on probleem. Asi on selles, et kui väljad tabelites on samanimelised, siis PHP massiivis tekib nimede konflikt ja võidab ainult üks väli, teist aga ei ole.

Probleemi lahendamiseks tuleb konfliktseid nimesid ümber nimetada läbi käsu as:

sqlSELECT users.name, cities.name as city_name

Seos

Pärast käsku ON peame määrama väljad kahest tabelist, mille kaudu seos luuakse. Meie puhul on see väli id linnade tabelist ja väli city_id kasutajate tabelist:

sqlON cities.id=users.city_id

Päring

Lõpuks näeb päring, mis toob kasutajad koos nende linnadega, välja järgmine:

sqlSELECT 
  users.name, cities.name as city_name
FROM 
  users
LEFT JOIN cities ON cities.id=users.city_id

Praktilised ülesanded

Задание 1

Olgemel on tabel toodetega ja tabel nende kategooriatega. Kirjutage päring, mis toob toodete nimed koos nende kategooriatega.