求和列查询中的一行

时间:2013-08-23 16:21:43

标签: mysql sql

我正在构建以下查询:

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

3 个答案:

答案 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,所以我编写了一个常量值,但您可以将其更改为您需要的任何值。