你在這裏做什麼是所謂的JOIN
(雖然你做它含蓄,因爲你從多個表中選擇)。這意味着,如果您沒有在您的WHERE子句中添加任何條件,那麼這些表中的所有組合都是。只有在您的條件下,您才能將加入限制爲飲料ID匹配的那些行。
但仍有X的結果多行,每喝一杯,如果有X的照片與此特定drinks_id。您的聲明不限制哪個您想要的照片!
如果只想喝每一個行,你必須告訴SQL你想,如果有與特定drinks_id多行做什麼。爲此,您需要分組和aggregate function。您告訴SQL您想要將哪些條目組合在一起(例如所有相同的drinks_id),並且在SELECT中,必須告知應該採用每個分組結果行的不同條目。對於數字,這可以是平均值,最小值,最大值(僅舉一些)。
在你的情況,我看不到感查詢照片飲料,如果你只想要一行。您可能認爲您的結果中可能會有陣列照片,但SQL無法執行此操作。如果你只是想任何照片,你不在乎,你會被drinks_id得到的,只是組(爲了得到每飲料只有一行):
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
在MySQL中,我們也有GROUP_CONCAT,如果你想要的文件名要連接到一個單一的字符串:
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
但是,如果在字段值中有,
,這可能會變得很危險,因爲很可能您想在客戶端再次拆分它。它也不是一個標準的SQL聚合函數。
那麼你有5匹配的行,因爲你有幾行drink_id相同。你會期望*會發生什麼?你希望保留哪張照片? –