Nes*_*Web 65 mysql multiple-tables
SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_id
yeilds 5行(5个数组),photo
是一行中唯一的唯一字段.name, price
重复(这里, fanta-
name, price
重复3次.)我如何摆脱这些重复?
编辑: 我想要name, price
和photo
每个饮料的所有.
id name price
1. fanta 5
2. dew 4
id photo drinks_id
1. ./images/fanta-1.jpg 1
2. ./images/fanta-2.jpg 1
3. ./images/fanta-3.jpg 1
4. ./images/dew-1.jpg 2
5. ./images/dew-2.jpg 2
Run Code Online (Sandbox Code Playgroud)
lee*_*mes 94
你在这里做的是a JOIN
(虽然你隐式地这样做,因为你从多个表中选择).这意味着,如果您没有在WHERE子句中添加任何条件,则您拥有这些表的所有组合.只有在您符合条件的情况下,才能将您的加入限制为饮酒ID匹配的行.
但是如果有特定drink_id的X张照片,每个饮品的结果中仍然有X个多行.你的陈述不限制哪个你想有张相片!
如果您每个饮料只需要一行,那么如果有多行具有特定的drink_id,则必须告诉SQL您要执行的操作.为此,您需要分组和聚合函数.您告诉SQL要将哪些条目组合在一起(例如,所有相等的drink_id),并且在SELECT中,您必须告知应该采用每个分组结果行的哪些不同条目.对于数字,这可以是平均值,最小值,最大值(仅举几例).
在你的情况下,如果你只想要一行,我就看不出要查看照片的意义了.您可能认为每个饮料的结果中都有一系列照片,但SQL无法做到这一点.如果您只想要任何照片并且不关心您将获得哪些照片,请按drink_id进行分组(每个饮品只能获得一行):
SELECT name, price, photo
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id
GROUP BY drinks_id
Run Code Online (Sandbox Code Playgroud)
name price photo
fanta 5 ./images/fanta-1.jpg
dew 4 ./images/dew-1.jpg
Run Code Online (Sandbox Code Playgroud)
在MySQL中,如果您希望将文件名连接到一个字符串,我们还有GROUP_CONCAT:
SELECT name, price, GROUP_CONCAT(photo, ',')
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id
GROUP BY drinks_id
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但是,如果您,
在字段值内,这可能会变得很危险,因为很可能您希望在客户端再次拆分它.它也不是标准的SQL聚合函数.