Συσχετίσεις Δεδομένων στην PHP

Ας υποθέσουμε ότι αντιμετωπίζουμε το πρόβλημα της αποθήκευσης πατέρων και γιων. Ας υποθέσουμε ότι κάθε πατέρας μπορεί να έχει μόνο έναν γιο, και ο γιος με τη σειρά του μπορεί επίσης να έχει έναν γιο.

Πρέπει να σκεφτούμε πώς θα αποθηκεύσουμε τα δεδομένα. Η πρώτη ιδέα που μπορεί να έρθει στο μυαλό - είναι να δημιουργήσουμε δύο πίνακες: parents για τους πατέρες και sons για τους γιους. Στη συνέχεια να συνδέσουμε αυτούς τους πίνακες με κάποιο πεδίο: son_id ή parent_id.

Ωστόσο, αυτή η ιδέα δεν είναι πολύ καλή - γιατί το ίδιο άτομο μπορεί να είναι ταυτόχρονα και πατέρας και γιος - και θα πρέπει να το αποθηκεύσουμε και στους δύο πίνακες, κάτι που είναι άβολο, καταλαμβάνει περισσότερο χώρο και εύκολα οδηγεί σε λάθη.

Μια καλύτερη επιλογή - είναι να συνδέσουμε τον πίνακα με τον εαυτό του: ας δημιουργήσουμε τον πίνακα users, σε αυτόν θα αποθηκεύσουμε όλους τους χρήστες και σε κάθε έναν θα δώσουμε ένα πεδίο son_id, στο οποίο θα αποθηκεύεται το id του γιου από τον ίδιο πίνακα:

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

Ερωτήματα

Ας γράψουμε τώρα ένα ερώτημα που θα ανακτήσει τον χρήστη μαζί με τον γιο του.

Αρχικά, ας ανακτήσουμε απλώς τους χρήστες:

sqlSELECT
  *
FROM
  users

Τώρα ας κάνουμε join στους χρήστες με τους γιους τους. Θα κάνουμε join τον πίνακα με τον εαυτό του, επομένως χρειάζεται να τον μετονομάσουμε:

sqlLEFT JOIN users as sons

Τώρα μπορούμε να καθορίσουμε τη σχέση του κύριου πίνακα και του μετονομασμένου πίνακα:

sqlLEFT JOIN users as sons ON sons.id=users.son_id

Ας καθορίσουμε τώρα τα πεδία:

sqlSELECT
  users.name as user_name, sons.name as son_name

Ας τα ενώσουμε όλα μαζί και θα πάρουμε το ακόλουθο ερώτημα:

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

Πρακτικά Προβλήματα

Задание 1

Ας υποθέσουμε ότι έχουμε κατηγορίες. Κάθε κατηγορία μπορεί να ανήκει σε μια γονική κατηγορία, η οποία με τη σειρά της μπορεί να ανήκει στη δική της γονική κατηγορία και ούτω καθ' εξής. Περιγράψτε τη δομή αποθήκευσης.

Задание 2

Γράψτε ένα ερώτημα που θα ανακτήσει μια κατηγορία μαζί με τη γονική της κατηγορία.

Задание 3

Γράψτε ένα ερώτημα που θα ανακτήσει μια κατηγορία μαζί με τον γονέα της και τον παππού της.

Задание 4

Γράψτε ένα ερώτημα που θα ανακτήσει μια κατηγορία μαζί με τον γονέα της, τον παππού της και τον προ-παππού της.