如何按mysql中列的总和对行进行分类?

Goo*_*bot 3 mysql

我有一张桌子

id  num_items  folder
1   4
2   33
3   74
4   41
5   24
6   34
7   46
8   55
9   11
Run Code Online (Sandbox Code Playgroud)

我想为行分配文件夹编号,但限制每个文件夹中的项目数(例如 100)。因此,如果SUM(num_items) > 100.

UPDATEd文件夹应该看起来像

id  num_items  folder
1   4          1
2   33         1
3   74         2
4   41         3
5   24         3
6   34         3
7   46         4
8   55         4
9   11         5
Run Code Online (Sandbox Code Playgroud)

因为,SUM对整个列进行计算,显然,我需要SUM在达到文件夹中的最大项目后重置值/过程。

Der*_*ney 5

一种选择可能是使用用户变量:

SET @folder = 1;
SET @items = 0;
SELECT id, num_items, 
  (SELECT IF(((@items:=@items+num_items)>100), @folder:=@folder+1,   @folder)) as folder, 
  IF(@items>100,@items:=0,@items) as checkItems
FROM foo;
Run Code Online (Sandbox Code Playgroud)

这是它的sql 小提琴,尽管您的示例 id=4 不匹配。在第一个块中,它是 44,在预期的输出块中它是 41,所以文件夹是关闭的。


在这里添加一个警告。根据用户变量文档

作为一般规则,您永远不应为用户变量赋值并在同一语句中读取该值。您可能会得到预期的结果,但这并不能保证。

要时刻铭记在心。

RolandoMySQLDBA 编辑 (2012-12-17 14:30 EDT)

为了确定用户变量的样子,可能会沿途打印每个用户变量:(参见示例

SET @folder = 1;
SET @items = 0;
SELECT id, num_items, 
  @folder as CurrentFolder_Before,
  @items as CurrentItems_Before,
  (SELECT IF(((@items:=@items+num_items)>100), @folder:=@folder+1,   @folder)) as folder, 
  IF(@items>100,@items:=0,@items) as checkItems,
  @folder as CurrentFolder_After,
  @items as CurrentItems_After
FROM foo;
Run Code Online (Sandbox Code Playgroud)

DTest 为他的用户变量应用获得了 +1。

  • 子查询和缓慢没有任何联系。如果它们真的很慢,很可能你可以加快它们的速度。 (2认同)