MYSQL: где условие «Накопительная сумма» не работает при добавлении ORDER BY в запрос - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь получить все записи из таблицы 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, это сработает (почему, Боже?).

Может кто-нибудь сказать мне, почему это происходит, или показать мне, как делать то, что я хочу?

1 Ответ

0 голосов
/ 09 мая 2018

В более поздних версиях 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;

Я не в восторге от использования @total в WHERE. Я думаю, что я бы пошел на:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...