Mysql 使用第二个表对表中的日志值求和

Mysql 使用第二个表对表中的日志值求和,mysql,sql,Mysql,Sql,我有一个巨大的表格,其中一个新行可能是对前一行的“调整” 表a: Id | RefId | TransId |Score ---------------------------------- 101 | null | 3001 | 10 102 | null | 3002 | 15 103 | null | 3003 | 15 104 | 101 | | -5 105 | nu

我有一个巨大的表格,其中一个新行可能是对前一行的“调整”

表a:

Id   | RefId |   TransId    |Score 
----------------------------------
101  |  null |    3001      |  10
102  |  null |    3002      |  15
103  |  null |    3003      |  15
104  |  101  |              |  -5
105  |  null |    3004      |   5
106  |  105  |              | -10 
107  |  null |    3005      |  15 
表B:

TransId | Person 
----------------
3001  |  Harry
3002  |  Draco
3003  |  Sarah 
3004  |  Ron 
3005  |  Harry 
在上表中,哈利在表A中得到10分。Id=101,在表A中扣除5分。Id=104,然后在表A中再得到15分。Id=107

我想在这里做的是,返回所有行,其中Harry是连接到分数的人。问题是扣分的行没有名字,只有给出分数的行(通过表B)。但是,分数总是从以前给定的分数中扣除,其中原始交易的Id在表中称为“RefId”

这只给了我哈利的分数,没有扣分。我想返回总得分,对哈利来说是20分。(10-5+15=20)

我如何让MySQL也包含负面分数?我觉得应该可以使用TableA.RefId。类似于“如果有RefId,则从此行中获取分数,但查看相应的TableA.Id以获取其余数据”。

尝试以下方法:

 select sum(sum1 + sums) as sum_all from (
      SELECT  t1.id,T1.Score sum1, coalesce(T2.score,0) sums
      FROM Table1 t1
      inner JOIN Table2 ON T1.TransId=Table2.TransId
      left JOIN Table1 t2 ON  t2.RefId = t1.id 
       WHERE  Table2.Person='Harry'
      )c

输出:

 SUM_ALL
 20

如果假设调整不会修改调整,则可以在不聚合所有数据的情况下执行此操作:

select sum(a.score + coalesce(aref.score, 0)) as HarryScore
from tableA a left outer join
     tableA aref
     on a.refId = aref.id left outer join
     tableB b
     on a.TransId = b.Transid left outer join
     tableB bref
     on aref.TransId = bref.TransId
where b.Person = 'Harry' or bref.Person = 'Harry';

您的数据结构是一棵树,MySQL基本上不支持遍历树或图形。您可能需要创建一个存储过程来执行此操作或更改数据的布局。
 SUM_ALL
 20
select sum(a.score + coalesce(aref.score, 0)) as HarryScore
from tableA a left outer join
     tableA aref
     on a.refId = aref.id left outer join
     tableB b
     on a.TransId = b.Transid left outer join
     tableB bref
     on aref.TransId = bref.TransId
where b.Person = 'Harry' or bref.Person = 'Harry';