0

请考虑以下查询:

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 行并且没有应用于查询的WHERE, HAVING, LIMITor子句时?GROUP BY
  2. 有价值的artist$styles记录只有三个,为什么要计数?p_id14
  3. 为什么如果我添加一个GROUP BY子句我会得到正确的结果?

    SELECT artist.id, COUNT(DISTINCT artist$styles.v_id)
    FROM artist
    LEFT JOIN artist$styles ON artist$styles.p_id = artist.id
    GROUP BY artist.id
    ----
    id  count
    1   3
    2   1
    3   3
    4   1
    
  4. 这一切对我来说毫无意义。这可能是MySQL的错误吗?我正在运行社区 5.5.25a

4

3 回答 3

3
  1. 关于聚合函数的手册页中所述(其中COUNT()之一):

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

  2. 手册页中所述GROUP BY,隐藏列

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

    换句话说,服务器已经为 column 选择了一个(不确定的)值p_id,在这种情况下恰好是 value 1,同时它已经正确地聚合并计算了COUNT()函数的结果。

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

  4. 这不是错误;此行为已记录在案并且是设计使然。

于 2012-07-23T09:42:25.813 回答
0
  1. 如果您不使用 group by 子句,则计数函数返回单行结果,这就是它返回一行的原因。

2.在你的输出中

id  count
1   4

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

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

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

于 2012-07-23T09:50:00.380 回答
0

这可能是 Mysql 中的一个错误。所有非聚合列都应包含在 Group by 子句中。MySQL 不强制这样做,结果是不可预测的并且难以调试。通常,始终在 Group by 子句中包含所有非聚合列。这就是所有 RDBMS 的工作方式

于 2012-07-23T09:35:30.333 回答