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:
SELECT 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:
SELECT *
Pentru ca datele să fie selectate din toate
tabelele, trebuie să specificați înainte de * numele
tabelului pentru selecție:
SELECT users.*, cities.*
Sau puteți enumera câmpurile de care avem nevoie cu specificarea numelui tabelului înaintea lor:
SELECT 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:
SELECT 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:
ON cities.id=users.city_id
Interogarea
În final, interogarea care va extrage utilizatorii împreună cu orașele lor va arăta astfel:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Probleme practice
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.