Duomenų gavimas iš susijusių lentelių PHP

Padarykime užklausą, kuri gaus visus vartotojus kartu su jų miestais. Tam mums reikės LEFT JOIN komandos:

Jos sintaksė atrodo taip:

sqlSELECT laukai FROM lentelės_pavadinimas
  LEFT JOIN susietos_lentelės_pavadinimas ON ryšio_sąlyga 
WHERE atrankos_sąlyga

Išnagrinėkime atskiras šios komandos sintaksės dalis.

Laukai

Kadangi atranka vyksta iš kelių lentelių, visų laukų atranka naudojant * neveiks. Ši užklausa pasirinks laukus tik iš pagrindinės lentelės, bet ne iš susietos:

sqlSELECT *

Kad duomenys būtų renkami iš visų lentelių, prieš * reikia nurodyti lentelės pavadinimą atrankai:

sqlSELECT users.*, cities.*

Arba galima išvardinti mums reikalingus laukus nurodant lentelės pavadinimą prieš juos:

sqlSELECT users.name, cities.name

Šie du būdai turi problemą. Taip yra dėl to, kad jei laukai lentelėse turi vienodus pavadinimus, tai PHP masyve įvyks pavadinimų konfliktas ir laimės tik vienas laukas, o antrojo nebus.

Problemai išspręsti reikia konfliktuojančius pavadinimus pervadinti naudojant as komandą:

sqlSELECT users.name, cities.name as city_name

Ryšys

Po ON komandos turime nurodyti laukus iš dviejų lentelių, pagal kuriuos užmezgamas ryšys. Mūsų atveju tai bus laukas id iš miestų lentelės ir laukas city_id iš vartotojų lentelės:

sqlON cities.id=users.city_id

Užklausa

Galų gale užklausa, kuri gaus vartotojus kartu su jų miestais atrodys taip:

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

Praktinės užduotys

Задание 1

Tarkime, kad turite prekių lentelę ir lentelę su jų kategorijomis. Parašykite užklausą, kuri gautų prekių pavadinimus kartu su jų kategorijomis.