Это решение будет выполнять накопительную сумму, останавливаясь, когда сумма превышает 1000:
SELECT NULL AS users_count, NULL AS total
FROM dual
WHERE (@total := 0)
UNION
SELECT users_count, @total := @total + users_count AS total
FROM messages_queue
WHERE @total < 1000;
Это означает, что если у вас есть два значения, скажем, 800, общая сумма будет равна 1600. Первый SELECT предназначен только для инициализации переменной @total
.
Если вы хотите, чтобы сумма не превышала 1000, за исключением случаев, когда значение в одной строке превышает 1000, тогда я думаю, что это работает, хотя вам необходимо провести тщательное тестирование:
SELECT NULL AS users_count, NULL AS total, NULL AS found
FROM dual
WHERE (@total := 0 OR @found := 0)
UNION
SELECT users_count, @total AS total, @found := 1 AS found
FROM messages_queue
WHERE (@total := @total + users_count)
AND @total < 1000
UNION
SELECT users_count, users_count AS total, 0 AS found
FROM messages_queue
WHERE IF(@found = 0, @found := 1, 0);