Lingitud tabelite ahel
Oletame nüüd, et kasutajad elavad kindlates linnades, ja need linnad asuvad erinevates riikides. Sellisel juhul vajame salvestamiseks juba kolme tabelit: kasutajad on seotud linnadega, ja linnad on seotud riikidega. Samas ei pea meil olema kasutajate ja riikide vahelist seosevälja - sest kasutajad on niikuinii seotud riikidega läbi linnade ja riikide vahelise seose.
Vaatame meie tabeleid. Tabel riikidega:
| id | name |
|---|---|
| 1 | country1 |
| 2 | country2 |
Tabel linnadega:
| id | name | country_id |
|---|---|---|
| 1 | city1 | 1 |
| 2 | city2 | 1 |
| 3 | city3 | 2 |
Tabel kasutajatega jääb muutumatuks:
| id | name | city_id |
|---|---|---|
| 1 | user1 | 1 |
| 2 | user2 | 1 |
| 3 | user3 | 2 |
| 4 | user4 | 1 |
| 5 | user5 | 3 |
| 6 | user6 | 2 |
Päringud
Selleks, et saada kasutajad koos nende linnade ja riikidega, peame tegema kaks ühendust (JOIN): esimene ühendab linnad kasutajatega, ja teine ühendab riigid linnadega:
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
Praktilised ülesanded
Oletame, et tooted kuuluvad kindlasse alamkategooriasse, ja alamkategooriad kuuluvad kindlasse kategooriasse. Kirjeldage salvestusstruktuur.
Kirjutage päring, mis toob tooted, koos nende alamkategooriate ja kategooriatega.
Kirjutage päring, mis toob alamkategooriad koos nende kategooriatega.