要查询的SUM查询,直到SUM(users_count)达到1000

Ara*_*oor 13 mysql sql select sum

我需要一个SQL查询来从我的消息队列中选择行,直到SUM(users_count)达到最多1000. 但是如果只返回一行并且该行的users_count大于1000,则没有问题.

我需要类似的东西:(我添加了自己的关键字)

SELECT * FROM `messages_queue` UNTIL SUM(users_count) < 1000 AT LEAST 1 ROW
Run Code Online (Sandbox Code Playgroud)

这是我的表结构:

messages_queue
- msg_id
- msg_body - users_count
(消息接收者的数量)
- 时间(插入时间)

Mik*_*ike 15

此解决方案将执行累积总和,当总和超过1000时停止:

SELECT NULL AS users_count, NULL AS total
  FROM dual
 WHERE (@total := 0)
 UNION
SELECT users_count, @total := @total + users_count AS total
  FROM messages_queue
 WHERE @total < 1000;
Run Code Online (Sandbox Code Playgroud)

这意味着如果你有两个值,比如800,总和将是1600.第一个SELECT只是初始化@total变量.

如果你想防止总和超过1000,除了单行的值大于1000的情况,那么我认为这是有效的,尽管你需要对它进行一些严格的测试:

SELECT NULL AS users_count, NULL AS total, NULL AS found
  FROM dual
 WHERE (@total := 0 OR @found := 0)
 UNION
SELECT users_count, @total AS total, @found := 1 AS found
  FROM messages_queue
 WHERE (@total := @total + users_count)
   AND @total < 1000
 UNION
SELECT users_count, users_count AS total, 0 AS found
  FROM messages_queue
 WHERE IF(@found = 0, @found := 1, 0);
Run Code Online (Sandbox Code Playgroud)

  • @Aram Alipoor:值得一提的是,这只适用于MySQL,因为它使用MySQL变量.您可以在这篇精彩文章中找到更多信息:[高级MySQL用户变量技术](http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/). (3认同)

pil*_*eks 5

我试图将此作为评论添加到 Mike 的答案,但是,变量的 @ 符号存在问题。

为了借鉴 Mike 的答案,实际上可以通过初始化 FROM 子句中的变量来缩短查询,例如:

SELECT users_count, @total := @total + users_count AS total
    FROM (messages_queue, (select @total := 0) t)
WHERE @total < 1000;
Run Code Online (Sandbox Code Playgroud)