Mysql 使用第二个表对表中的日志值求和
我有一个巨大的表格,其中一个新行可能是对前一行的“调整” 表a: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
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';