请考虑以下问题:
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
问题是:
artist
表中的一行,当时有4行且没有WHERE
,HAVING
,{{1} }或LIMIT
子句应用于查询?GROUP BY
中只有三条记录的artist$styles
值为p_id
,为什么还要计算1
?为什么我向其添加4
子句会得到正确的结果?
GROUP BY
这一切对我来说都没有意义。这可能是MySQL的错误吗?我正在运行社区5.5.25a
答案 0 :(得分:2)
如the manual page on aggregate functions中所述(其中COUNT()
是一个):
如果在不包含
GROUP BY
子句的语句中使用组函数,则相当于对所有行进行分组。
如the manual page on GROUP BY
with hidden columns中所述:
服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。
换句话说,服务器为列p_id
选择了一个(不确定)值,在这种情况下发生的值为值1
,同时它已正确聚合并计算结果COUNT()
功能。
因为您正在分组正确的列,而不是所有行。
这不是一个bug;这种行为是通过设计记录的。
答案 1 :(得分:0)
这是Mysql中可能存在的错误。所有非aggeregate列都应包含在Group by子句中。 MySQL不会强制执行此操作,结果不可预测且难以调试。通常,包含Group by子句中的所有非聚合列。这就是所有RDBMS的工作方式
答案 2 :(得分:0)
2.在你的输出中
id count
1 4
4表示该表中的结果总数不是id 1的结果,并且它显示在1的前面,因为只有一行产生。
3.当您使用group时,会创建一组该列值,这就是您获得该输出的原因。
最后它不是bug.Mysql提供了一个适当的文档,您可以在mysql站点上阅读。