Ανάκτηση δεδομένων από συσχετισμένους πίνακες σε PHP

Ας κάνουμε ένα ερώτημα που θα ανακτήσει όλους τους χρήστες μαζί με τις πόλεις τους. Για αυτό θα χρειαστούμε την εντολή LEFT JOIN:

Η σύνταξή της είναι η εξής:

sqlSELECT πεδία FROM όνομα_πίνακα
  LEFT JOIN όνομα_συσχετισμένου_πίνακα ON συνθήκη_σύνδεσης 
WHERE συνθήκη_επιλογής

Ας αναλύσουμε τα μεμονωμένα μέρη της σύνταξης αυτής της εντολής.

Πεδία

Εφόσον η επιλογή γίνεται από πολλούς πίνακες, η επιλογή όλων των πεδίων μέσω * δεν θα λειτουργήσει. Το ακόλουθο ερώτημα θα επιλέξει πεδία μόνο από τον κύριο πίνακα, αλλά όχι από τον συσχετισμένο:

sqlSELECT *

Για να επιλεγούν δεδομένα από όλους τους πίνακες, πρέπει πριν από το * να ορίσετε το όνομα του πίνακα για επιλογή:

sqlSELECT users.*, cities.*

Εναλλακτικά, μπορείτε να απαριθμήσετε τα απαιτούμενα πεδία ορίζοντας το όνομα του πίνακα πριν από αυτά:

sqlSELECT users.name, cities.name

Αυτές οι δύο μέθοδοι έχουν ένα πρόβλημα. Το γεγονός είναι ότι εάν τα πεδία στους πίνακες έχουν πανομοιότυπα ονόματα, τότε στον πίνακα PHP θα υπάρξει μια διένεξη ονομάτων και μόνο ένα πεδίο θα "κερδίσει", ενώ το δεύτερο δεν θα υπάρχει.

Για να λυθεί το πρόβλημα, τα ονόματα που βρίσκονται σε διένεξη πρέπει να μετονομαστούν μέσω της εντολής as:

sqlSELECT users.name, cities.name as city_name

Σύνδεση

Μετά την εντολή ON πρέπει να ορίσουμε τα πεδία από τους δύο πίνακες, μέσω των οποίων πραγματοποιείται η σύνδεση. Στην περίπτωσή μας, αυτό θα είναι το πεδίο id από τον πίνακα των πόλεων και το πεδίο city_id από τον πίνακα των χρηστών:

sqlON cities.id=users.city_id

Ερώτημα

Τελικά, το ερώτημα που θα ανακτήσει τους χρήστες μαζί με τις πόλεις τους θα είναι το εξής:

sqlSELECT 
  users.name, cities.name as city_name
FROM 
  users
LEFT JOIN cities ON cities.id=users.city_id

Πρακτικές Ασκήσεις

Задание 1

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