Henting av data fra relaterte tabeller i PHP
La oss lage en spørring som henter
alle brukere sammen med deres byer. For å gjøre dette
trenger vi LEFT
JOIN-kommandoen:
Syntaksen ser slik ut:
SELECT felter FROM tabellnavn
LEFT JOIN relatert_tabellnavn ON tilkoblingsbetingelse
WHERE utvalgsbetingelse
La oss gå gjennom delene av syntaksen for denne kommandoen.
Felter
Siden utvalget kommer fra flere tabeller,
vil ikke utvalg av alle felter via *
fungere. Følgende spørring vil kun velge felter
fra hovedtabellen, men ikke fra den relaterte tabellen:
SELECT *
For at data skal hentes fra alle
tabeller, må du før * spesifisere tabellnavnet
for utvalget:
SELECT users.*, cities.*
Alternativt kan du liste opp de nødvendige feltene med tabellnavnet foran dem:
SELECT users.name, cities.name
Disse to metodene har et problem. Saken er at hvis feltene i tabellene har identiske navn, vil det i PHP-arrayet oppstå en navnekonflikt og kun ett felt vil vinne, mens det andre ikke vil være tilstede.
For å løse problemet må du endre de konfliktfylte navnene
via as- kommandoen:
SELECT users.name, cities.name as city_name
Tilkobling
Etter ON- kommandoen må vi spesifisere
feltene fra de to tabellene som utgjør
tilkoblingen. I vårt tilfelle vil dette være feltet id
fra bytabellen og feltet city_id
fra brukertabellen:
ON cities.id=users.city_id
Spørring
Til slutt vil spørringen som henter brukere sammen med deres byer se slik ut:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Praktiske oppgaver
Anta at du har en tabell med produkter og en tabell med deres kategorier. Skriv en spørring som henter produktnavn sammen med deres kategorier.