我有一些我正在维护的遗留代码,那里有一个我不理解的SQL查询。我希望有人可以向我解释这个目的。查询如下所示:
select * from product_performance
where merchantid = 2151277 and clickday >= '2011-09-01'
group by null;
当我在最后没有group by null
的情况下运行此查询时,我得到44行。当我使用group by null
运行它时,我得到1行 - 前一组中的第一行。这里发生了什么,使用这个分组的目的是什么?
答案 0 :(得分:7)
它通过一个常量值对整个查询进行分组,这使得它可以随机有效地选择一行来返回。您可以使用LIMIT 1
获得相同的结果。
请注意,此习惯用法不是标准SQL,如果在其他数据库中尝试,可能会导致错误。在MySQL中,您可以通过指定ONLY FULL GROUP BY
SQL模式来禁用此行为。有关详细信息,请参阅the documentation。
OTOH,LIMIT 1
也是非标准的,但是得到更广泛的支持,并且在符合SQL:2008和FETCH ... ONLY
子句的数据库中可以实现相同的效果。有关详细信息,请参阅this。
答案 1 :(得分:0)
合, 让我们在这种模式下解释: 如果你有
select emp_id, dept_id
from employees
group by dept_id
你会得到每一行的一行,一个emp_id,不保证是谁。 这意味着大数据会在各个部门中出现。
如果你拍摄
select emp_id, dept_id
from employees
group by dept_id, emp_id
你将获得由depts和emps分割的数据。
但是如果你group by null
,这意味着你不会分裂任何东西。 你有一个小组。 而mysql会给你一个emp_id和一个dept,不能保证从哪一行开始。