我正在尝试从 storage_movements
获取所有记录表直到 weight
列总和达到特定值。这是我正在尝试执行的查询:
SELECT id, storage_id, weight, (@total := weight + @total) as c_sum
FROM `storage_movements`
JOIN (SELECT @total := 0) r
WHERE @total < 100000
AND weight > 0
AND storage_id=4
AND id < 1000
ORDER BY id DESC
它不起作用。它继续添加 @total
不尊重WHERE
子句( @total
超过 100000
直到所有记录完成)。
如果我做出一些改变,就会发生奇怪的事情。喜欢:
- 如果我删除
AND id < 1000
线,它的工作原理与预期一致(但我需要这条线)。 - 如果我删除
ORDER BY id DESC
线,也可以(但我也需要这条线)。 - 如果我删除
AND storage_id=4
,它有效(但我也需要这条线)。 - 如果我改变
AND storage_id=4
至AND storage_id < 4
,它有效(为什么,上帝?)。
有人可以告诉我为什么会发生这种情况,或者告诉我如何做我想做的事吗?
最佳答案
在较新版本的 MySQL 中,您需要先进行排序:
SELECT id, storage_id, weight, (@total := weight + @total) as c_sum
FROM (SELECT sm.*
FROM storage_movements sm
WHERE weight > 0 AND storage_id = 4 AND id < 1000
ORDER BY id
) sm CROSS JOIN
(SELECT @total := 0) r
WHERE @total < 100000;
我对在 WHERE
中使用 @total
不太感兴趣。我想我会选择:
SELECT id, storage_id, weight, (@total := weight + @total) as c_sum
FROM (SELECT sm.*
FROM storage_movements sm
WHERE weight > 0 AND storage_id = 4 AND id < 1000
ORDER BY id
) sm CROSS JOIN
(SELECT @total := 0) r
HAVING c_sum < 100000;
关于MYSQL:将 ORDER BY 添加到查询中时,累积总和的 Where 子句不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50256466/