使用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,并且很难弄清楚为什么会这样。
答案 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
查询的工作方式:
WHERE
子句过滤的行被分组;组中的所有行对于GROUP BY
子句中存在的第一个表达式具有相同的值; GROUP BY
子句包含两个或更多表达式,则使用GROUP BY
子句中的第二个表达式将在第一步创建的每个组拆分为子组; GROUP BY
子句中的每个后续表达式重复步骤2,创建嵌套子组; 如果SELECT
子句中的列或表达式不使用GROUP BY
聚合函数且GROUP BY
子句中不存在,则某些组可能包含具有不同值的行那列/表达;这是一个错误。
为了避免这种情况发生,SQL标准只允许SELECT
子句中满足以下条件之一的表达式:
GROUP BY
子句中; GROUP BY
aggregate function; GROUP BY
子句中显示的列。让我们分析查询的SELECT
子句中的表达式:
u.name
- 在初始查询中满足条件#1;在没有GROUP BY
的查询中,它不满足任何条件。这使得查询无效SQL。count(u.name)
- 它在两个版本的查询中都满足条件#2;它没有问题。即使没有GROUP BY
的查询版本不是有效的SQL,最高版本为5.7.5,MySQL允许它,但它保留了return indeterminate values for the invalid expressions(u.name
)的自由
在这种情况下,服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的。此外,添加
ORDER BY
子句不会影响每个组中值的选择。
简单来说,这意味着没有GROUP BY
的查询会返回followers
的正确值,但name
返回的值在同一查询的不同执行中可能会有所不同。如果多次运行查询,则无法观察到此行为,但是在从表中添加或删除行或者备份表,截断它然后从备份中还原(或在其他计算机上重新创建表)后,可能会发生这种情况不同版本的MySQL)。