你在这里做什么是所谓的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相同。你会期望*会发生什么?你希望保留哪张照片? –