Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SELECT * FROM mehreren Tabellen. MySQL

Was Sie hier tun, wird als JOIN bezeichnet (obwohl Sie dies implizit tun, da Sie aus mehreren Tabellen auswählen). Das heißt, wenn Sie keine Bedingungen in Ihre WHERE-Klausel aufgenommen haben, hatten Sie alle Kombinationen dieser Tabellen. Nur mit Ihrer Bedingung beschränken Sie Ihren Join auf die Zeilen, in denen die Getränke-ID übereinstimmt.

Aber es gibt immer noch X mehrere Zeilen im Ergebnis für jedes Getränk, wenn es X Fotos mit dieser bestimmten drinks_id gibt. Ihre Aussage schränkt welche nicht ein Foto(s), die Sie haben möchten!

Wenn Sie nur eine Zeile pro Getränk möchten, müssen Sie SQL mitteilen, was Sie tun möchten, wenn es mehrere Zeilen mit einer bestimmten drinks_id gibt. Dazu benötigen Sie eine Gruppierung und eine Aggregatfunktion . Sie teilen SQL mit, welche Einträge Sie gruppieren möchten (z. B. alle gleichen drinks_ids) und im SELECT müssen Sie angeben, welche der unterschiedlichen Einträge für jede gruppierte Ergebniszeile genommen werden sollen. Bei Zahlen kann dies Durchschnitt, Minimum, Maximum sein (um nur einige zu nennen).

In Ihrem Fall sehe ich keinen Sinn, die Fotos nach Getränken abzufragen, wenn Sie nur eine Zeile möchten. Sie dachten wahrscheinlich, Sie könnten eine Reihe von Fotos haben in Ihrem Ergebnis für jedes Getränk, aber SQL kann dies nicht tun. Wenn Sie nur irgendwelche wollen Foto und es ist Ihnen egal, was Sie bekommen, gruppieren Sie einfach nach der drinks_id (um nur eine Zeile pro Getränk zu erhalten):

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 haben wir auch GROUP_CONCAT , wenn Sie möchten, dass die Dateinamen zu einer einzigen Zeichenfolge verkettet werden:

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

Dies kann jedoch gefährlich werden, wenn Sie , haben innerhalb der Feldwerte, da Sie dies höchstwahrscheinlich clientseitig wieder aufteilen möchten. Es ist auch keine standardmäßige SQL-Aggregatfunktion.