Recupero di dati da tabelle correlate in PHP
Facciamo una query che recupererà
tutti gli utenti insieme alle loro città. Per questo
avremo bisogno del comando LEFT
JOIN:
La sua sintassi è la seguente:
SELECT campi FROM nome_tabella
LEFT JOIN nome_tabella_correlata ON condizione_collegamento
WHERE condizione_selezione
Analizziamo le singole parti della sintassi di questo comando.
Campi
Poiché la selezione avviene da più tabelle,
la selezione di tutti i campi tramite * non
funzionerà. La seguente query selezionerà i campi solo
dalla tabella principale, ma non da quella correlata:
SELECT *
Affinché i dati vengano selezionati da tutte
le tabelle, è necessario specificare il nome
della tabella prima di * per la selezione:
SELECT users.*, cities.*
In alternativa, è possibile elencare i campi necessari specificando il nome della tabella prima di essi:
SELECT users.name, cities.name
Questi due metodi hanno un problema. Il fatto è che se i campi nelle tabelle hanno nomi identici, nell'array PHP ci sarà un conflitto di nomi e vincerà solo un campo, mentre il secondo non sarà presente.
Per risolvere il problema, è necessario rinominare
i nomi in conflitto tramite il comando as:
SELECT users.name, cities.name as city_name
Collegamento
Dopo il comando ON dobbiamo specificare
i campi delle due tabelle tramite i quali viene stabilito
il collegamento. Nel nostro caso, saranno il campo id
della tabella delle città e il campo city_id
della tabella degli utenti:
ON cities.id=users.city_id
Query
Alla fine, la query che recupererà gli utenti insieme alle loro città sarà la seguente:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Compiti pratici
Supponiamo di avere una tabella con i prodotti e una tabella con le loro categorie. Scrivi una query che recuperi i nomi dei prodotti insieme alle loro categorie.