Łańcuch powiązanych tabel
Załóżmy teraz, że użytkownicy mieszkają w określonych miastach, a te miasta znajdują się w różnych krajach. W takim przypadku do przechowywania będziemy potrzebować już trzech tabel: użytkownicy będą powiązani z miastami, a miasta - z krajami. Przy tym nie będziemy potrzebować pola łączącego użytkowników z krajami - przecież użytkownicy i tak będą powiązani z krajami poprzez powiązanie miast i krajów.
Spójrzmy na nasze tabele. Tabela z krajami:
| id | name |
|---|---|
| 1 | country1 |
| 2 | country2 |
Tabela z miastami:
| id | name | country_id |
|---|---|---|
| 1 | city1 | 1 |
| 2 | city2 | 1 |
| 3 | city3 | 2 |
Tabela z użytkownikami pozostanie niezmieniona:
| id | name | city_id |
|---|---|---|
| 1 | user1 | 1 |
| 2 | user2 | 1 |
| 3 | user3 | 2 |
| 4 | user4 | 1 |
| 5 | user5 | 3 |
| 6 | user6 | 2 |
Zapytania
Aby pobrać użytkowników razem z ich miastami i krajami, będziemy musieli wykonać dwa złączenia: pierwsze dołączy miasta do użytkowników, a drugie - kraje do miast:
SELECT
users.name,
cities.name as city_name,
countries.name as country_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
LEFT JOIN countries ON countries.id=cities.country_id
Zadania praktyczne
Załóżmy, że produkty należą do określonej podkategorii, a podkategorie należą do określonej kategorii. Opisz strukturę przechowywania.
Napisz zapytanie, które pobierze produkty, razem z ich podkategoriami i kategoriami.
Napisz zapytanie, które pobierze podkategorie razem z ich kategoriami.