Mysql 添加GROUPBY或DISTINCT如何得到相同的结果集?

Mysql 添加GROUPBY或DISTINCT如何得到相同的结果集?,mysql,sql,join,group-by,distinct,Mysql,Sql,Join,Group By,Distinct,当我运行这个查询时,它会给我冗余的结果集,如下所示 但如果我加上 选择DISTINCT unit.id,而不是在开头或结尾处选择unit.id 在末尾按unit.unit.id分组。它给出了如下正确的结果集 我的问题是我上面的queryjoin有什么问题?即使我已经更正了它们,它也会给出多余的结果?为什么添加选择DISTINCT unit.id或GROUP BY unit.unit.id与修复此问题的查询相同?区分和分组是不同的功能 假设我知道添加`SELECT DISTINCT unit.id

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

但如果我加上

选择DISTINCT unit.id,而不是在开头或结尾处选择unit.id 在末尾按unit.unit.id分组。它给出了如下正确的结果集


我的问题是我上面的queryjoin有什么问题?即使我已经更正了它们,它也会给出多余的结果?为什么添加选择DISTINCT unit.id或GROUP BY unit.unit.id与修复此问题的查询相同?区分和分组是不同的功能


假设我知道添加`SELECT DISTINCT unit.id将删除多余的结果,但是添加两个代码段中的一个如何得到相同的结果集?显然,SELECT DISTINCT unit.id应该通过GROUP by是如何删除冗余行的?

基本上,您是在对结果进行分组,而不使用聚合函数(例如,使用计数或最大值),因此,您获得聚合行的方式与选择DISTINCT对象获得聚合行的方式相同。如果您不需要聚合它们,那么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
当您使用distinct子句或group by时,它将删除上述组合中的重复项。希望这对您有所帮助。

如果您想使用聚合或分组函数,则主要使用GROUP BY。例如,如果要查找匹配的行数,可以执行以下操作:

(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. 
因为COUNT是一个聚合函数,所以需要按其他列分组。如果您没有执行任何聚合函数,那么GROUPBY实际上只是将行聚合起来,如果您编写它的方式是这样的,那么它只会导致一行—与DISTINCT相同


上面的连接给出了多余的结果,即使我已经纠正了连接它们 为什么

这是因为你的桌子:

何塞乌单位。 何塞·普莱斯。 何塞城市。 乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔斯·乔。 它们相互关联


这些表之间似乎有一对多或多对多的关系。例如,对于jos_-fine_基础中的每个记录,每顿饭都有一个单位,因此许多饭可能是用同一个单位测量的,因此,当连接两个表时,您将获得冗余单位。其他表也是如此。

上面的join给出了多余的结果,即使我已经更正了join,为什么?您将表中的单位与价格和城市与单位合并。mealbase表在哪里联接?如果同一个城市、价格、单位的组合有多个值,那么您将得到重复的值,但这是正常的。。。您可以添加一些数据示例吗?unit.mealbasis\u id=mealbase.id用于联接表。所有表的联接都已更正。只是为了确保正确理解:您有重复的行,所以完全相同的行重复了多次?可能会发生这种情况,因为您没有准确地联接表,而是在这些数据之间进行叉积:您是否尝试过在查询中使用联接构造?非常感谢。让我也试试。是的,我知道,我在问题中也提到过。我想知道的是它是如何发生的?上面的连接给出了冗余的结果,即使我已经纠正了连接它们为什么?上面的连接给出了冗余的结果,即使我已经纠正了连接它们为什么?在两个表之间可能会有一对多的关系。尝试逐点构建查询并检查返回的行。在某个时候,您将更改基数并引入其他行。感谢您的解释:-
SELECT
  id
, COUNT(id) num_rows
FROM
...
GROUP BY id