Deze oplossing voert een cumulatieve som uit en stopt wanneer de som de 1000 overschrijdt:
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;
Dat betekent dat als je twee waarden hebt van bijvoorbeeld 800, de som 1600 is. De eerste SELECT is alleen om de @total
te initialiseren variabel.
Als je wilt voorkomen dat de som de 1000 overschrijdt, behalve in gevallen waarin een enkele rij een waarde heeft die groter is dan 1000, dan denk ik dat dit werkt, hoewel je het aan een aantal rigoureuze tests moet onderwerpen:
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);