0
SELECT unit.id,
       unit.unit_name,
       unit.description,
       unit.category_id,
       city.name,
       mealbase.name AS mealbase_name,
       unit.province_id,
       unit.rooms,
       unit.max_people,
       unit.thumblocation,
       prices.normal_price,
       prices.holiday_price
FROM   jos_units AS unit,
       jos_prices AS prices,
       jos_cities AS city,
       jos_meal_basis AS mealbase
WHERE  prices.unit_id = unit.id
       AND city.id = unit.city_id
       AND unit.published = 1
       AND unit.mealbasis_id = mealbase.id

当我运行这个查询时,它给了我冗余的结果集,如下所示。

在此处输入图像描述

但是如果我添加

SELECT DISTINCT unit.id而不是SELECT unit.id在开头 GROUP BY unit.unit.id结尾。它给了我正确的结果集,如下所示。

在此处输入图像描述

我的问题是我的查询出了什么问题(即使我已更正加入它们,上面的加入也会产生多余的结果)?为什么这里的查询(解决问题)的添加SELECT DISTINCT unit.id或相同?GROUP BY unit.unit.id(DISTINCT 和 GROUP BY 是不同的功能)

鉴于我知道添加 `SELECT DISTINCT unit.id 将删除冗余结果,但是添加两个片段中的一个如何给出相同的结果集?显然 SELECT DISTINCT unit.id 应该通过 GROUP BY 如何删除冗余行?

4

4 回答 4

3

基本上,您在不使用聚合函数的情况下对结果进行分组(例如使用 aCOUNT或 a MAX),因此您获得聚合行的方式与通过选择DISTINCT对象获得聚合行的方式相同。如果您不需要聚合它们,DISTINCT是正确的做法。

于 2012-12-17T09:37:11.990 回答
3

即使我已更正加入它们,上面的加入也会产生多余的结果,这是为什么?

那是因为您的表格如何:

  • jos_units.
  • jos_prices.
  • jos_cities.
  • jos_meal_basis.

彼此相关。

这些表之间似乎有一对多或多对多的关系。例如,对于 中的每条记录jos_meal_basis,每餐都有一个单位,因此可能会以同一个单位来衡量多餐,然后在连接两个表时,您将因此得到多余的单位。与其他表相同。

于 2012-12-17T09:50:44.513 回答
1

您在第一个查询中的组合,即

(unit.id,
       unit.unit_name,
       unit.description,
       unit.category_id,
       city.name,
       mealbase.name AS mealbase_name,
       unit.province_id,
       unit.rooms,
       unit.max_people,
       unit.thumblocation,
       prices.normal_price,
       prices.holiday_price) has duplicates and so you are getting more than 1 rows for the same combination. 

当您使用distinct clause or group by它时,它会删除上述组合中的重复项。希望这对您有所帮助。

于 2012-12-17T09:42:44.947 回答
1

GROUP BY如果您想使用聚合或分组函数,则主要使用它。例如,如果您想查找匹配的行数,您可以这样做

SELECT
  id
, COUNT(id) num_rows
FROM
...
GROUP BY id

因为这COUNT是一个聚合函数,您需要按其他列分组。如果您没有执行任何聚合函数,GROUP BY则本质上只是将行聚合起来(如果这是您编写的方式),仅导致一行 - 与DISTINCT.

于 2012-12-17T09:43:38.240 回答