`Count Distinct`和`Group By`会产生奇怪的结果

时间:2012-07-23 09:31:41

标签: mysql sql count group-by distinct

请考虑以下问题:

SELECT artist.id, COUNT(DISTINCT artist$styles.v_id)
FROM artist
LEFT JOIN artist$styles ON artist$styles.p_id = artist.id

这是我得到的结果:

id  count
1   4

问题是:

  1. 为什么它只选择artist表中的一行,当时有4行且没有WHEREHAVING,{{1} }或LIMIT子句应用于查询?
  2. GROUP BY中只有三条记录的artist$styles值为p_id,为什么还要计算1
  3. 为什么我向其添加4子句会得到正确的结果?

    GROUP BY
  4. 这一切对我来说都没有意义。这可能是MySQL的错误吗?我正在运行社区5.5.25a

3 个答案:

答案 0 :(得分:2)

  1. the manual page on aggregate functions中所述(其中COUNT()是一个):

      

    如果在不包含GROUP BY子句的语句中使用组函数,则相当于对所有行进行分组。

  2. the manual page on GROUP BY with hidden columns中所述:

      

    服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。

    换句话说,服务器为列p_id选择了一个(不确定)值,在这种情况下发生的值为值1,同时它已正确聚合并计算结果COUNT()功能。

  3. 因为您正在分组正确的列,而不是所有行。

  4. 这不是一个bug;这种行为是通过设计记录的。

答案 1 :(得分:0)

这是Mysql中可能存在的错误。所有非aggeregate列都应包含在Group by子句中。 MySQL不会强制执行此操作,结果不可预测且难以调试。通常,包含Group by子句中的所有非聚合列。这就是所有RDBMS的工作方式

答案 2 :(得分:0)

  1. 如果您不使用group by子句,则Count Function返回单行结果,这就是它返回一行的原因。
  2. 2.在你的输出中

    id  count
    1   4
    

    4表示该表中的结果总数不是id 1的结果,并且它显示在1的前面,因为只有一行产生。

    3.当您使用group时,会创建一组该列值,这就是您获得该输出的原因。

    最后它不是bug.Mysql提供了一个适当的文档,您可以在mysql站点上阅读。