Mysql
 sql >> Database >  >> RDS >> Mysql

SELEZIONA * DA più tabelle. MySQL

Quello che fai qui si chiama JOIN (anche se lo fai implicitamente perché selezioni da più tabelle). Ciò significa che, se non hai inserito alcuna condizione nella tua clausola WHERE, avevi tutte le combinazioni di quei tavoli. Solo con la tua condizione limiti il ​​tuo join a quelle righe in cui l'ID bevanda corrisponde.

Ma ci sono ancora X righe multiple nel risultato per ogni drink, se ci sono X foto con questo particolare drink_id. La tua affermazione non limita quale foto che vuoi avere!

Se vuoi solo una riga per drink, devi dire a SQL cosa vuoi fare se ci sono più righe con un particolare drink_id. Per questo è necessario il raggruppamento e una funzione di aggregazione . Dici a SQL quali voci vuoi raggruppare (ad esempio tutti drink_ids uguali) e in SELECT, devi dire quale delle voci distinte per ogni riga di risultato raggruppata dovrebbe essere presa. Per i numeri, questo può essere medio, minimo, massimo (per citarne alcuni).

Nel tuo caso, non vedo il senso di interrogare le foto per le bevande se vuoi solo una riga. Probabilmente hai pensato di poter avere una serie di foto nel tuo risultato per ogni drink, ma SQL non può farlo. Se vuoi solo qualsiasi foto e non ti interessa quale otterrai, basta raggruppare per drink_id (per ottenere solo una riga per drink):

SELECT name, price, photo
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id

name     price   photo
fanta    5       ./images/fanta-1.jpg
dew      4       ./images/dew-1.jpg

In MySQL, abbiamo anche GROUP_CONCAT , se vuoi che i nomi dei file siano concatenati a un'unica stringa:

SELECT name, price, GROUP_CONCAT(photo, ',')
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id

name     price   photo
fanta    5       ./images/fanta-1.jpg,./images/fanta-2.jpg,./images/fanta-3.jpg
dew      4       ./images/dew-1.jpg,./images/dew-2.jpg

Tuttavia, questo può diventare pericoloso se hai , all'interno dei valori del campo, poiché molto probabilmente si desidera dividerlo nuovamente sul lato client. Inoltre, non è una funzione di aggregazione SQL standard.