Αλυσίδα Συνδεδεμένων Πινάκων
Ας υποθέσουμε τώρα ότι οι χρήστες ζουν σε συγκεκριμένες πόλεις, και αυτές οι πόλεις βρίσκονται σε διαφορετικές χώρες. Σε αυτήν την περίπτωση, για την αποθήκευση θα χρειαστούμε ήδη τρεις πίνακες: οι χρήστες θα συνδέονται με τις πόλεις, και οι πόλεις - με τις χώρες. Εν τω μεταξύ, δεν θα χρειαζόμασταν ένα πεδίο σύνδεσης χρηστών με χώρες - επειδή οι χρήστες θα είναι ήδη συνδεδεμένοι με τις χώρες μέσω της σύνδεσης των πόλεων και των χωρών.
Ας δούμε τους πίνακές μας. Ο πίνακας με τις χώρες:
| id | name |
|---|---|
| 1 | country1 |
| 2 | country2 |
Ο πίνακας με τις πόλεις:
| id | name | country_id |
|---|---|---|
| 1 | city1 | 1 |
| 2 | city2 | 1 |
| 3 | city3 | 2 |
Ο πίνακας με τους χρήστες θα παραμείνει αμετάβλητος:
| id | name | city_id |
|---|---|---|
| 1 | user1 | 1 |
| 2 | user2 | 1 |
| 3 | user3 | 2 |
| 4 | user4 | 1 |
| 5 | user5 | 3 |
| 6 | user6 | 2 |
Ερωτήματα
Για να ανακτήσουμε τους χρήστες μαζί με τις πόλεις και τις χώρες τους, θα πρέπει να κάνουμε δύο joins: ο πρώτος θα συνδέσει τις πόλεις με τους χρήστες, και ο δεύτερος - τις χώρες με τις πόλεις:
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
Πρακτικές Ασκήσεις
Ας υποθέσουμε ότι τα προϊόντα ανήκουν σε μια συγκεκριμένη υποκατηγορία, και οι υποκατηγορίες ανήκουν σε μια συγκεκριμένη κατηγορία. Περιγράψτε τη δομή αποθήκευσης.
Γράψτε ένα ερώτημα που θα ανακτήσει τα προϊόντα, μαζί με τις υποκατηγορίες και τις κατηγορίες τους.
Γράψτε ένα ερώτημα που θα ανακτήσει τις υποκατηγορίες μαζί με τις κατηγορίες τους.