开发者社区> 问答> 正文

mysql sum 函数使用问题? 400 报错

mysql sum 函数使用问题? 400 报错

开发中有个需求,

要查询数据库前几行总和大于某个值的记录,如下:

id  amount

1   100

2   200

3   300

4   400

5   500

以上5条记录,要查询sum(amount)总和小于800的记录,按id排序,希望查询的结果是 1,2,3,总和是600,不知道这个sql如何写,数据库mysql。

求大神赐教!!!



展开
收起
爱吃鱼的程序员 2020-06-04 14:02:07 604 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    select a.id, b.id, c.id, a.amount+b.amount+c.amount as sum
    from st a, st b, st c
    where a.id<>b.id and b.id<>c.id and a.id<>c.id

    and a.amount+b.amount+c.amount <800


    ######

    引用来自“_Yud”的评论

    select a.id, b.id, c.id, a.amount+b.amount+c.amount as sum
    from st a, st b, st c
    where a.id<>b.id and b.id<>c.id and a.id<>c.id

    and a.amount+b.amount+c.amount <800


    这个是知道了3条记录,其实多少条记录是未知的,那个总和也是个可变的数值,不知道是不是我表达的不清楚吗?通俗一点,就是要查询总和等于或小于这个值得前多少条记录,事先无法知道到底的前多少条。######

    有可能是我知识储备不够,我没想到一条SQL可以直接实现这个功能。不过我可以给你个解决的思路

    a).使用碰撞法来查找记录集

    定义一个存储过程,融合二分查找法的思想来实现具体逻辑。

    先定义一个变量,代表从第条记录开始碰撞查找,默认可以为10或你认为合适的一个值。循环碰撞,先sum前10条记录,看看是否符合我的目标。

    若大于我的目标,10/2再次查找;若小于我的目标,10*2再次查找,或10+10再次查找。

    另外记录每次查找的条目数,若本次结果大于目标值,并且本次条目数与我记录的上次记录数相比较只差1,则结束循环。具体逻辑在实现时再微调。

    b).增加一个当前记录合计值字段,每次需要计算时,循环处理每条记录,第1条的这个字段值为本身的amount,第2条的值为第1条amount+第2条amount,一直到这个值大于你的目标,然后通过这个字段过滤即可。如果排序方法固定,甚至每次插入或更新的时候,直接操作一下对应的记录都可以

    ######谢谢你的思路
    2020-06-04 16:26:51
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像