Hämta data från relaterade tabeller i PHP
Låt oss göra en förfrågan som hämtar
alla användare tillsammans med deras städer. För detta
behöver vi kommandot LEFT
JOIN:
Dess syntax ser ut på följande sätt:
SELECT fält FROM tabellnamn
LEFT JOIN namn_på_relaterad_tabell ON villkor_för_relation
WHERE villkor_för_urval
Låt oss gå igenom de enskilda delarna av syntaxen för detta kommando.
Fält
Eftersom urvalet görs från flera tabeller,
kommer urval av alla fält via * inte att
fungera. Följande förfrågan väljer endast fält
från huvudtabellen, men inte från den relaterade:
SELECT *
För att data ska hämtas från alla
tabeller måste man före * ange tabellnamnet
för urvalet:
SELECT users.*, cities.*
Alternativt kan man lista de fält vi behöver med angivelse av tabellnamnet före dem:
SELECT users.name, cities.name
Dessa två sätt har ett problem. Saken är den, att om fälten i tabellerna har samma namn, kommer det i PHP-arrayen att uppstå en konflikt mellan namnen och bara ett fält kommer att "vinna", medan det andra inte kommer att finnas med.
För att lösa problemet måste man byta namn på de konfliktskapande namnen
via kommandot as:
SELECT users.name, cities.name as city_name
Relation
Efter kommandot ON måste vi ange
fälten från de två tabellerna som relationen
sker genom. I vårt fall kommer det att vara fältet id
från tabellen med städer och fältet city_id
från tabellen med användare:
ON cities.id=users.city_id
Förfrågan
Så småningom kommer förfrågan som hämtar användare tillsammans med deras städer att se ut på följande sätt:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Praktiska uppgifter
Antag att du har en tabell med produkter och en tabell med deras kategorier. Skriv en förfrågan som hämtar produktnamnen tillsammans med deras kategorier.