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如何删除冗余行?
答案 0 :(得分:3)
基本上,您在不使用聚合函数的情况下对结果进行分组(例如,使用COUNT
或MAX
),因此您获得聚合行的方式与获取聚合函数的方式相同选择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
相同。