我有一张桌子
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在达到文件夹中的最大项目后重置值/过程。
一种选择可能是使用用户变量:
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,所以文件夹是关闭的。
作为一般规则,您永远不应为用户变量赋值并在同一语句中读取该值。您可能会得到预期的结果,但这并不能保证。
要时刻铭记在心。
为了确定用户变量的样子,可能会沿途打印每个用户变量:(参见示例)
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。
| 归档时间: |
|
| 查看次数: |
904 次 |
| 最近记录: |