Was Sie hier tun, wird als a bezeichnet JOIN
(obwohl Sie dies implizit tun, weil 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 Ihre Verbindung auf die Zeilen, in denen die Getränke-ID übereinstimmt.
Es gibt jedoch immer noch X mehrere Zeilen im Ergebnis für jedes Getränk, wenn X Fotos mit dieser bestimmten Getränke-ID vorhanden sind. Ihre Aussage schränkt nicht ein, welche Fotos 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 mehrere Zeilen mit einer bestimmten Getränke-ID vorhanden sind. 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 in SELECT müssen Sie angeben, welche der unterschiedlichen Einträge für jede gruppierte Ergebniszeile verwendet werden sollen. Bei Zahlen kann dies Durchschnitt, Minimum, Maximum sein (um nur einige zu nennen).
In Ihrem Fall sehe ich keinen Sinn darin, die Fotos nach Getränken abzufragen, wenn Sie nur eine Zeile möchten. Sie dachten wahrscheinlich, Sie könnten für jedes Getränk eine Reihe von Fotos in Ihrem Ergebnis haben, aber SQL kann dies nicht. Wenn Sie nur ein Foto möchten und es Ihnen egal ist, welches Sie erhalten, gruppieren Sie es einfach nach der drink_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 ,
Werte innerhalb des Feldes haben, da Sie diese höchstwahrscheinlich auf der Clientseite erneut aufteilen möchten. Es ist auch keine Standard-SQL-Aggregatfunktion.