Giải pháp này sẽ thực hiện một tổng tích lũy, dừng lại khi tổng vượt quá 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;
Điều đó có nghĩa là nếu bạn có hai giá trị, chẳng hạn, 800, thì tổng cộng sẽ là 1600. CHỌN đầu tiên chỉ để khởi tạo @total
biến.
Nếu bạn muốn ngăn tổng không vượt quá 1000, ngoại trừ trường hợp một hàng có giá trị lớn hơn 1000, thì tôi nghĩ điều này hiệu quả, mặc dù bạn sẽ cần phải trải qua một số thử nghiệm nghiêm ngặt:
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);