mySQL计数只返回一个结果,除非使用group by

时间:2016-11-09 09:04:17

标签: mysql count group-by

使用SQL查询

select u.name,count(u.name) as 'followers'
from user u,follow f
where u.type = 'c' AND f.followee = u.email
group by u.name

为我的数据库中的所有用户获取正确的值,但是,没有逐行的完全相同的查询只给我第一个值。我是第一次学习SQL,并且很难弄清楚为什么会这样。

2 个答案:

答案 0 :(得分:4)

当您使用count without group by时,它将计算所有记录并返回single line,而当您使用count with group by时,它将group the users基于其名称并返回计数each group

答案 1 :(得分:1)

  

没有group by行的完全相同的查询只给出了第一个值。

不完全。

没有group by的查询如下所示:

select u.name, count(u.name) as 'followers'
from user u, follow f
where u.type = 'c' AND f.followee = u.email

该查询使用的COUNT()GROUP BY aggregate function。这些函数要求查询中存在GROUP BY子句。但是,SQL标准是容忍的,并接受您查询并从WHERE子句筛选的所有行创建单个组。

另一方面,没有GROUP BY子句的查询无效。

这是GROUP BY查询的工作方式:

  1. WHERE子句过滤的行被分组;组中的所有行对于GROUP BY子句中存在的第一个表达式具有相同的值;
  2. 如果GROUP BY子句包含两个或更多表达式,则使用GROUP BY子句中的第二个表达式将在第一步创建的每个组拆分为子组;
  3. GROUP BY子句中的每个后续表达式重复步骤2,创建嵌套子组;
  4. 从上一步创建的每个组中,单个行计算;仅使用组中包含的行的值计算此行的值;
  5. 如果SELECT子句中的列或表达式不使用GROUP BY聚合函数且GROUP BY子句中不存在,则某些组可能包含具有不同值的行那列/表达;这是一个错误。

    为了避免这种情况发生,SQL标准只允许SELECT子句中满足以下条件之一的表达式:

    1. 表达式也出现在GROUP BY子句中;
    2. 表达式使用GROUP BY aggregate function;
    3. 计算
    4. 表达式使用的所有列在功能上都依赖于GROUP BY子句中显示的列。
    5. 让我们分析查询的SELECT子句中的表达式:

      • u.name - 在初始查询中满足条件#1;在没有GROUP BY的查询中,它不满足任何条件。这使得查询无效SQL。
      • count(u.name) - 它在两个版本的查询中都满足条件#2;它没有问题。

      即使没有GROUP BY的查询版本不是有效的SQL,最高版本为5.7.5,MySQL允许它,但它保留了return indeterminate values for the invalid expressionsu.name)的自由

      来自documentation

      的引用
        

      在这种情况下,服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的。此外,添加ORDER BY子句不会影响每个组中值的选择。

      简单来说,这意味着没有GROUP BY的查询会返回followers的正确值,但name返回的值在同一查询的不同执行中可能会有所不同。如果多次运行查询,则无法观察到此行为,但是在从表中添加或删除行或者备份表,截断它然后从备份中还原(或在其他计算机上重新创建表)后,可能会发生这种情况不同版本的MySQL)。