我正在构建以下查询:
SELECT taskid
FROM tasks, (SELECT @var_sum := 0) a
WHERE (@var_sum := @var_sum + taskid) < 10
结果:
taskid
1
2
3
现在它返回给我所有行,当求和时<10,我想在我的结果中包含一个额外的行(10可以是任何东西,它只是一个示例值)
所以,期望的结果:
taskid
1
2
3
4
答案 0 :(得分:1)
如果您想要第一个值为“&gt; = 10”:
SELECT taskid
FROM tasks, (SELECT @var_sum := 0) a
WHERE (@var_sum < 10) or (@var_sum < 10 and @var_sum := @var_sum + taskid) >= 10);
虽然这可能(可能)在实践中起作用,但我认为它不能保证有效。 MySQL没有指定where
子句的评估顺序。
编辑:
这应该有效:
select taskid
from (SELECT taskid, (@var_sum := @var_sum + taskid) as varsum
FROM tasks t cross join
(SELECT @var_sum := 0) const
) t
WHERE (varsum < 10) or (varsum - taskid < 10 and varsum >= 10);
答案 1 :(得分:1)
我会这样做:
SELECT t.taskid
FROM tasks t
CROSS
JOIN (SELECT @var_sum := 0) a
WHERE IF(@var_sum<10, @var_sum := @var_sum+t.taskid, @var_sum := NULL) IS NOT NULL
这是检查@var_sum
的当前值是否小于10(或小于等于或小于或等于任何值。如果是,我们将taskid值添加到@var_num,行包含在结果集中。但是当@var_sum的当前值不满足条件时,我们为它分配一个NULL,并且不包括该行。
注意不保证从tasks
表返回的行的顺序。 MySQL可以按任何顺序返回行;它可能在您的测试中看起来具有确定性,但这可能是因为MySQL针对相同的数据选择了相同的访问计划。
答案 2 :(得分:0)
要添加额外的行,请使用UNION ALL
,然后为额外的行编码您想要的内容:
SELECT taskid
FROM tasks, (SELECT @var_sum := 0) a
WHERE (@var_sum := @var_sum + taskid) < 10
UNION ALL
SELECT 4
因为您还没有说过如何获得额外的riw,所以我编写了一个常量值,但您可以将其更改为您需要的任何值。