MySql 查询指定字段的数据累加到指定值停止并返回结果应该怎么写?

数据表如下:

id name value
1 乔峰 30
2 段誉 50
3 虚竹 40
4 紫嫣 20

指定值:$sum = 100

id 正序排列字段,从第一条记录的 value 开始累加, id=1valueid=2value … 直到累加的值大于等于 $sum 结束查询并返回结果。

以上数据表正确的查询结果集返回的是 1,2,3 3 条记录。

我第一时间想到的是用 for 循环来查询,但这也太憨了,MYSQL 学的不好,还希望大家不吝赐教,非常感谢。

悲观者永远正确,乐观者永远前行。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

建议你分页批量查,比如,一次查 100 条(这个数据量不算多,相比你查 100 次,性能好的多),然后通过程序进行统计,如果总和不够,就继续查下一页,查到够为止。当然,你应当避免太多次的查询,所以一页查多少条,你根据自己业务去评估。

3年前 评论
讨论数量: 8

@Latent
@LiamHao

呼叫大佬 🤞

3年前 评论

建议你分页批量查,比如,一次查 100 条(这个数据量不算多,相比你查 100 次,性能好的多),然后通过程序进行统计,如果总和不够,就继续查下一页,查到够为止。当然,你应当避免太多次的查询,所以一页查多少条,你根据自己业务去评估。

3年前 评论

@忆往昔弹指间 好的,这个思路不错,我试着写一下,感谢~

3年前 评论

你这个需求没法用简单的一个 SQL 解决,@忆往昔弹指间 大佬的方式挺好,兼顾需求与效率,我也学习了。

3年前 评论

@LiamHao 嗯嗯,我昨天想了一下,确实是我想简单了

3年前 评论

建议你分页批量查,使用 chunk

3年前 评论
SELECT id,name,value,total_value FROM
(
    SELECT id,name,value,@total := @total + value AS 'total_value' FROM 
    (select id,name,value from google_uac_placement order by id asc) AS temp,
    (SELECT @total := 0) AS T1
    ORDER BY id ASC
) AS a
WHERE total_value <= 100;
3年前 评论
sreio

楼上老哥获取条数和楼主不一致,我改了一下 @wqggym :thumbsup:

SELECT id, name, value, total_value
FROM (
    SELECT id, name, value
        , @total := @total + value AS "total_value"
    FROM (
        SELECT id, name, value
        FROM google_uac_placement
        ORDER BY id ASC
    ) temp, (
            SELECT @total := 0
        ) T1
    ORDER BY id ASC
) a
WHERE total_value - `value` < 100;
3年前 评论