求大佬,关于多表联合计算问题

AlexYY0 2020-02-23 12:12:14
我项目用的springboot+vue,现在的业务需求是:有a b c d(id,min,max,cal_num)四张表: a根据外键id选择获取b中符合的数据,和a中的某列计算(加减乘除),得到sum1;同理,再获取c中的数据计算sum1;之后a再根据前面的数据sum1和sum2,加减乘除得到sum,当sum满足在d中的某一行的min,max范围后,获取cal_num和sum计算,得到我们要的最终值。 此操作涉及到批量操作,批量操作a中的某些行,请问该如何实现:前端,后端,还是数据库函数实习...... 对了,前面得到的sum1 sum2 和最终值还要存到另一张表中。 真的求大佬! 在哪一端实现,还有怎么操作,我现在有点懵逼。
...全文
312 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlexYY0 2020-03-02
  • 打赏
  • 举报
回复
引用 10 楼 BoRoBoRoMe的回复:
如果有多个匹配的场景怎么处理呢? 在多条记录都匹配的场景,如果所有记录都需要,那么就只是用aExtend.asum > d.dmin一个条件就可以了 如果d中各个记录其实没有交集,可以增加一条记录d.dmax=null,join的条件写成aExtend.asum > d.dmin and( aExtend.asum < d.dmax or d.dmax is null)
多谢大佬指点,了解了。
BoRoBoRoMe 2020-03-02
  • 打赏
  • 举报
回复
如果有多个匹配的场景怎么处理呢? 在多条记录都匹配的场景,如果所有记录都需要,那么就只是用aExtend.asum > d.dmin一个条件就可以了 如果d中各个记录其实没有交集,可以增加一条记录d.dmax=null,join的条件写成aExtend.asum > d.dmin and( aExtend.asum < d.dmax or d.dmax is null)
AlexYY0 2020-02-29
  • 打赏
  • 举报
回复
引用 8 楼 BoRoBoRoMe 的回复:
你说的对,第一条会慢一点 具体慢多少,需要看具体的网络状况,和读取的字段数多少 实际执行时间,还受到a、b、c、d表的总数据量,各表索引情况的影响
感谢大佬的解惑,最后问一句, aExtend.asum > d.dmin and aExtend.asum < d.dmax;如果d表最后一行说,只需要aExtend.asum > d.dmin就行了,这个怎么操作。毕竟最后一行了,大于1000就选择dv很常见。
AlexYY0 2020-02-28
  • 打赏
  • 举报
回复
引用 6 楼 BoRoBoRoMe 的回复:
可以通过下面代码将结果读出来,然后用流的形式写入数据库,如果不是同一个数据源

select av,abv,acv,asum*dv from (
    select a.*,av*bv as abv, av*cv as acv,(av+av*bv+av*cv) as asum from a
        left join b
            on a.bid=b.bid
        left join c
            on a.cid=c.cid
        where a的条件
    ) aExtend
    left join d
        on aExtend.asum > d.dmin and aExtend.asum < d.dmax
也可以这样

insert into xxxxx 
select av,abv,acv,asum*dv from (
    select a.*,av*bv as abv, av*cv as acv,(av+av*bv+av*cv) as asum from a
        left join b
            on a.bid=b.bid
        left join c
            on a.cid=c.cid
        where a的条件
    ) aExtend
    left join d
        on aExtend.asum > d.dmin and aExtend.asum < d.dmax
后者的缺点是,数据量比较大的时候会感觉是死机了,你不知道进行到哪里了
大佬非常感谢,实现了我的目标。我想问一下如果批量执行第一种的话,是否会速度较慢,比如一万条数据。
BoRoBoRoMe 2020-02-28
  • 打赏
  • 举报
回复
你说的对,第一条会慢一点 具体慢多少,需要看具体的网络状况,和读取的字段数多少 实际执行时间,还受到a、b、c、d表的总数据量,各表索引情况的影响
BoRoBoRoMe 2020-02-26
  • 打赏
  • 举报
回复
可以通过下面代码将结果读出来,然后用流的形式写入数据库,如果不是同一个数据源

select av,abv,acv,asum*dv from (
    select a.*,av*bv as abv, av*cv as acv,(av+av*bv+av*cv) as asum from a
        left join b
            on a.bid=b.bid
        left join c
            on a.cid=c.cid
        where a的条件
    ) aExtend
    left join d
        on aExtend.asum > d.dmin and aExtend.asum < d.dmax
也可以这样

insert into xxxxx 
select av,abv,acv,asum*dv from (
    select a.*,av*bv as abv, av*cv as acv,(av+av*bv+av*cv) as asum from a
        left join b
            on a.bid=b.bid
        left join c
            on a.cid=c.cid
        where a的条件
    ) aExtend
    left join d
        on aExtend.asum > d.dmin and aExtend.asum < d.dmax
后者的缺点是,数据量比较大的时候会感觉是死机了,你不知道进行到哪里了
AlexYY0 2020-02-26
  • 打赏
  • 举报
回复
引用 3 楼 BoRoBoRoMe 的回复:

select sumtable.id,d.cal_num from (select a.*,(a.v+b.v)+ (a.v+b.v) as sum from a
    left join b
        on a.bid=b.id
    left join c
        on a.cid=c.id
    where a的条件) sumtable
    left join d
        on sumtable.sum > d.min and sumtable.sum < d.max
大佬,有那味道了,但是我好像没陈述清除,我说仔细一点: a(aid,av,bid,cid) b(bid,bv) c(cid,cv) d(did,dmin,dmax,dv) 整个的计算方法是:result=(av+av*bv+av*cv)*dv。 括号里的选择哪个bv、vc,是根据a里面的bid,cid。 而选取哪个dv值,是根据括号里的值判断的,dmin<(av+av*bv+av*cv)<dmax。 而av,av*bv,av*cv,result都会存到另一个表。 此操作涉及到批量操作,批量操作a中的某些行。 不知道应该在后端,前端,还是数据库(函数)实现,求大佬指点。
BoRoBoRoMe 2020-02-25
  • 打赏
  • 举报
回复
得到的结构直接insert到另一个表就好了
BoRoBoRoMe 2020-02-25
  • 打赏
  • 举报
回复

select sumtable.id,d.cal_num from (select a.*,(a.v+b.v)+ (a.v+b.v) as sum from a
    left join b
        on a.bid=b.id
    left join c
        on a.cid=c.id
    where a的条件) sumtable
    left join d
        on sumtable.sum > d.min and sumtable.sum < d.max
AlexYY0 2020-02-24
  • 打赏
  • 举报
回复
在线等 求大佬指点迷津!
AlexYY0 2020-02-24
  • 打赏
  • 举报
回复
求大佬指点,挺急的!

67,541

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧