你在这里做的是称为
JOIN(虽然你隐式地做,因为你从多个表中选择)。这意味着,如果您没有在您的WHERE子句中放置任何条件,则您具有这些表的所有组合。只有你的条件,你限制你的加入那些饮料ID匹配的行。
但这仍然是X多行的结果为每个饮料,如果有X照片与这个特殊drinks_id。您的声明不限制您要拥有哪些照片!
如果每个饮料只需要一行,你必须告诉SQL你想做什么,如果有多个行与特定drinks_id。为此,你需要分组和一个aggregate function.你告诉SQL你想要组合在一起的条目(例如所有等于drinks_ids),在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标准聚合函数。