Obținerea datelor din tabele relaționate în PHP

Să facem o interogare care va extrage toți utilizatorii împreună cu orașele lor. Pentru aceasta vom avea nevoie de comanda LEFT JOIN:

Sintaxa sa arată astfel:

sqlSELECT câmpuri FROM nume_tabel
  LEFT JOIN nume_tabel_relaționat ON condiția_legăturii 
WHERE condiția_selecției

Să analizăm părțile individuale ale sintaxei acestei comenzi.

Câmpurile

Deoarece selecția se face din mai multe tabele, selectarea tuturor câmpurilor prin * nu va funcționa. Următoarea interogare va selecta câmpurile doar din tabelul principal, dar nu și din cel relaționat:

sqlSELECT *

Pentru ca datele să fie selectate din toate tabelele, trebuie să specificați înainte de * numele tabelului pentru selecție:

sqlSELECT users.*, cities.*

Sau puteți enumera câmpurile de care avem nevoie cu specificarea numelui tabelului înaintea lor:

sqlSELECT users.name, cities.name

Aceste două metode au o problemă. Ideea este că dacă câmpurile din tabele au aceleași nume, atunci în array-ul PHP va apărea un conflict de nume și va câștiga doar un câmp, iar al doilea nu va exista.

Pentru a rezolva problema, este necesar să redenumiți numele conflictuale folosind comanda as:

sqlSELECT users.name, cities.name as city_name

Legătura

După comanda ON trebuie să specificăm câmpurile din cele două tabele prin care se realizează legătura. În cazul nostru, acestea vor fi câmpul id din tabela cu orașe și câmpul city_id din tabela cu utilizatori:

sqlON cities.id=users.city_id

Interogarea

În final, interogarea care va extrage utilizatorii împreună cu orașele lor va arăta astfel:

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

Probleme practice

Задание 1

Să presupunem că aveți un tabel cu produse și un tabel cu categoriile lor. Scrieți o interogare care va extrage numele produselor împreună cu categoriile lor.