Pobieranie danych z powiązanych tabel w PHP
Wykonajmy zapytanie, które pobierze
wszystkich użytkowników wraz z ich miastami. Do tego
potrzebne nam będzie polecenie LEFT
JOIN:
Jego składnia wygląda następująco:
SELECT pola FROM nazwa_tabeli
LEFT JOIN nazwa_tabeli_powiązanej ON warunek_powiązania
WHERE warunek_wybioru
Przeanalizujmy poszczególne części składni tego polecenia.
Pola
Ponieważ selekcja odbywa się z kilku tabel,
wybór wszystkich pól za pomocą * nie będzie
działać. Następujące zapytanie wybierze pola tylko
z tabeli głównej, ale nie z tabeli powiązanej:
SELECT *
Aby dane były pobierane ze wszystkich
tabel, należy przed * podać nazwę
tabeli do selekcji:
SELECT users.*, cities.*
Albo można wypisać potrzebne nam pola z podaniem nazwy tabeli przed nimi:
SELECT users.name, cities.name
Te dwa sposoby mają problem. Chodzi o to, że jeśli pola w tabelach mają identyczne nazwy, to w tablicy PHP nastąpi konflikt nazw i zwycięży tylko jedno pole, a drugiego nie będzie.
Aby rozwiązać problem, należy zmienić nazwy
konfliktowych pól za pomocą polecenia as:
SELECT users.name, cities.name as city_name
Powiązanie
Po poleceniu ON musimy określić
pola z dwóch tabel, za pomocą których realizowane jest
powiązanie. W naszym przypadku będzie to pole id
z tabeli miast i pole city_id
z tabeli użytkowników:
ON cities.id=users.city_id
Zapytanie
Ostatecznie zapytanie, które pobierze użytkowników razem z ich miastami będzie wyglądać następująco:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Zadania praktyczne
Załóżmy, że masz tabelę z produktami i tabelę z ich kategoriami. Napisz zapytanie, które pobierze nazwy produktów wraz z ich kategoriami.