添加GROUP BY或DISTINCT如何给出相同的结果集?

时间:2012-12-17 09:33:01

标签: mysql sql join group-by distinct

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

当我运行此查询时,它为我提供了如下的冗余结果集。

enter image description here

但如果我添加

SELECT DISTINCT unit.id而不是SELECT unit.id开头     最后GROUP BY unit.unit.id。它给出了正确的结果集如下。

enter image description here

我的问题是我的查询出了什么问题(上面的连接提供了多余的结果,即使我已经更正加入了它们)?为什么添加SELECT DISTINCT unit.idGROUP BY unit.unit.id对于查询(修复问题)是相同的? (DISTINCT和GROUP BY是不同的功能)

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

  

加入以上给出了多余的结果,即使我已经更正了加入它们   为什么会这样?

那是因为你的表格如何:

  • jos_units
  • jos_prices
  • jos_cities
  • jos_meal_basis

彼此相关。

看起来这些表之间存在一对多或多对多的关系。例如,对于jos_meal_basis中的每个记录,每餐都有一个单位,因此可以通过同一单位测量多餐,然后当加入两个表时,您将获得冗余单位。与其他表格相同。

答案 2 :(得分: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时,它会删除上述组合中的重复项。希望这会对你有所帮助。

答案 3 :(得分:1)

如果要使用聚合或组函数,则主要使用

GROUP BY。例如,如果您想要找到与您匹配的行数

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

因为COUNT是一个聚合函数,您需要按其他列进行分组。如果您没有执行任何聚合函数,GROUP BY实际上只是聚合行(如果这是您编写它的方式),只会导致一行 - 与DISTINCT相同。