- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个正在执行的 SELECT
查询,它有一个 MAX()
列和一个 GROUP BY
子句,除了我需要返回给客户端的这个查询的结果,我还需要返回所有结果的总数。
基本上我的查询是这样的:
SELECT unique_id, col1, col2, MAX(col3) as col3
FROM tbl
GROUP BY col1, col2
它通常也会有一个 WHERE
子句。
unique_id
是表的主键。
将此数据返回给客户端时,我还指定了 LIMIT
和 OFFSET
子句以限制一次检索的结果数。我的问题是,如果上面的查询没有 LIMIT
和 OFFSET
子句,我还需要显示结果的总数,以便客户端可以稍后/增量检索其余部分。
我知道我可以轻松地使用 WITH
临时表来获得我想要的:
WITH temp AS (
SELECT unique_id, col1, col2, MAX(col3) as col3
FROM tbl
GROUP BY col1, col2
)
SELECT count(*) FROM temp
但我担心这样做的效率。 sans-LIMIT
-and-OFFSET
查询可能会返回数万行,所以我认为 WITH
获取总计数不是执行此操作的最佳方法。
有没有我没有想到的更有效的方法?或者 WITH
方法是否合适(例如,MySQL 服务器是否足够“智能”,不会分配查询的整个结果集来获取计数)?
假设这是我表中的数据:
unique_id col1 col2 col3
___________________________
1 5 8 30
2 5 8 33
3 5 9 40
4 6 8 30
5 6 8 31
6 6 8 32
7 6 9 39
8 7 8 33
9 7 8 32
10 8 8 34
所以我的 SELECT
查询会返回这个(假设客户端指定了 LIMIT 4 OFFSET 0
):
SELECT unique_id, col1, col2, max(col3) as col3
FROM tbl
GROUP BY col1, col2
LIMIT 4
OFFSET 0;
unique_id col1 col2 col3
___________________________
2 5 8 33
3 5 9 40
6 6 8 32
7 6 9 39
然后我将不带 LIMIT
和OFFSET
子句的查询用作子查询和SELECT COUNT(*)
,这将返回 6
,我会将 6
和结果返回给客户端。
最佳答案
MySQL 8 引入了对 window functions 的支持,包括窗口聚合函数。窗口聚合函数允许您将聚合结果与非聚合数据一起返回。基本上,您可以通过将 OVER
子句附加到它来将常规聚合函数转换为窗口聚合函数,但通常您可能需要指定其他选项,这在链接中有详细说明手册。
您也可以在 GROUP BY
查询中使用窗口聚合函数。在这些情况下,窗口聚合函数将在分组完成后应用于行集。另请注意,添加 LIMIT
不会影响窗口聚合函数的结果。
考虑到以上所有因素,您可以像这样修改原始查询:
SELECT
unique_id,
col1,
col2,
MAX(col3) as col3,
COUNT(*) OVER () AS TotalRows
FROM
tbl
GROUP BY
col1,
col2
LIMIT
4 OFFSET 0
;
并一次性获取原始明细数据和行数。 OVER
子句没有附加子句,这意味着它适用于整个行集。
正如我所说,如果一个窗口聚合函数附加到查询,它将忽略 LIMIT
子句。因此,上面的 TotalRows
列将反射(reflect)行数,就好像没有应用限制一样。
关于mysql - MAX() 和 GROUP BY,需要整个结果的 COUNT(*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52278339/
目录 count作用 测试 count(*) count(1) count(col) count(id):统计id count(inde
目录 1.初识COUNT 2.COUNT(字段)、COUNT(常量)和COUNT(*)之间的区别 3.COUNT(*)的优化 MyIS
以下 SQL Server 2008 语句之间有什么区别? SELECT COUNT(*) FROM dbo.Regular_Report SELECT COUNT(0) FROM dbo.Regul
如果字符串(短语)中只有元音,它(对我而言)说True;否则说 False。我不明白为什么它总是返回 False,因为 (x >= x) 总是返回 True。我感谢任何人检查此查询的解决方案。 (st
1.概述 在这个文章之前,我一直用count(1) 查询所有数据,以前我们都是说 count(*) 是最慢的。但是这个博客恰恰相反。 对于 count(主键 id) 来说,InnoDB 引擎会遍历整张
这个问题已经有答案了: Count(*) vs Count(1) - SQL Server (13 个回答) 已关闭 8 年前。 我经常发现这三种变体: SELECT COUNT(*) FROM Fo
为什么三个查询的成本相同?我想至少应该有一个更快。否则,只使用关键字 COUNT() 而不是 COUNT(parameter) 就可以了。 例如,以下是不依赖于参数的 COUNT() 示例实现: wh
我有一个“产品”表和一个“评论”表。 我想编写一个查询来返回每个产品的评论的 COUNT 和 AVG。 并且如果没有评论,我希望它为 COUNT 和 AVG 返回 0/null。 产品表 +-----
我会保持简短和亲切,因为我确信我缺少的是一些简单的东西。我正在尝试获取一个 NSMutableArray 的计数,它可以包含可变数量的对象(id 号)。数组是从 JSon 数据创建的,数组本身是完美创
我想知道查询计数的计数。 查询是 sourcetype="cargo_dc_shipping_log" OR sourcetype="cargo_dc_deliver_log" | stats cou
任何人都知道我如何在 SQL 炼金术中进行计数 COUN(IF(table_row = 1 AND table_row2 =2),1,0) 我做了这样的东西, func.COUNT(func.IF((
我有一个有四列的表(销售); id, user_id, product_id, and date_added. 我需要统计某个用户已售出的具有特定 id 的产品数量,并获取该用户当月售出的产品总数。
我是来问这个问题的实现的 MYSQL count of count? 我的问题是将我从一个表中提取结果的结果联系起来,使用它们来查询同一数据库的另一个表 (抱歉,我不是强大的 xySQL)。 我有一个
这是我的查询 SELECT COUNT(*) as total, toys, date FROM T1 WHERE (date >= '2012-06-26'AND date '0') UNION
我有 2 个表:成员,订单。 Members: MemberID, DateCreated Orders: OrderID, DateCreated, MemberID 我想找出给定月份中新成员的数
我最近在一次采访中被问到这个问题。我在 mySQL 中尝试了这个,并得到了相同的结果(最终结果)。All 给出了该特定表中的行数。谁能解释它们之间的主要区别。 最佳答案 没什么,除非您在表格中指定字段
我有一个包含 2157 条记录的表,假设有 3 列(A、B、C),我知道在 A 列中有 2154 个不同的值。 使用连接到 BigQuery 的 Tableau Desktop(及其自身的功能),我得
我试图查看当天的车辆销量,并创建另外两个列来告诉我过去 10 天的销量和过去 20 天的销量。同一天和同一辆车可能有多个销售。我的目标是获取不同的车辆和日期并查看他们的销售数量。 N 天计数应与该行中
我有一个非常简单的问题。我想知道某个数据库行是否存在。 我通常使用: SELECT 1 FROM `my_table` WHERE `field_x` = 'something' 然后我获取结果: $
我想要的输出的描述:我想要两个线程 Gaurav 和 john 完成一个 while 循环(从 1 到 8),这样无论哪个线程启动 ist,都会运行 5 次迭代(即直到 count=5 ) ,然后进入
我是一名优秀的程序员,十分优秀!