88

SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_id

产生 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
4

3 回答 3

120

您在这里所做的称为 a JOIN(尽管您隐含地这样做是因为您从多个表中进行选择)。这意味着,如果您没有在 WHERE 子句中添加任何条件,那么您将拥有这些表的所有组合。只有在您的条件下,您才能将加入限制在饮料 ID 匹配的那些行中。

但是,如果有 X 张带有此特定饮料 ID 的照片,则每种饮料的结果中仍有 X 多行。您的声明不限制您想要拥有哪些照片!

如果您只希望每杯饮料只有一行,则必须告诉 SQL 如果有多行具有特定的饮料 ID,您要做什么。为此,您需要分组和聚合函数。您告诉 SQL 您想要将哪些条目组合在一起(例如所有相等的饮料 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 聚合函数。

于 2012-10-15T06:01:44.043 回答
3

您将在此处获得名称和价格的重复值。而且 ids 在drinks_photos 表中是重复的。你无法避免它们。还有你想要的输出到底是什么?

于 2012-10-15T06:04:59.497 回答
2

为了摆脱重复,您可以按drinks.id. 但是这样一来,您每张照片只能获得一张照片drinks.id(您将获得哪张照片取决于数据库内部实现)。

虽然没有记录,但在 MySQL 的情况下,你会得到最低的照片id(根据我的经验,我从未见过其他行为)。

SELECT name, price, photo 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id
GROUP BY drinks.id
于 2012-10-15T06:03:41.823 回答