mysql:orderby添加到查询时,关于累计和的where子句不起作用

d4so4syb  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(308)

我正试着从 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=4AND storage_id < 4 ,它工作(为什么,上帝?)。
有人能告诉我为什么会这样,或者告诉我怎么做吗?

kmbjn2e3

kmbjn2e31#

在较新版本的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;

我对使用 @totalWHERE . 我想我会选择:

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;

相关问题