我有几个表,我们假设有三个表+用户表。
所有表都有一个名为email的外键和一个得分字段。
用户:
id email
1 a@mail.com
2 b@email.com
T1:
id email score
1 a@mail.com 2
2 a@mail.com 7
3 a@mail.com 8
4 b@mail.com 3
T2:
id email score
1 a@mail.com 4
T3:
id email score
1 b@mail.com 5
我想从三个表中找到每个用户得分的总和, 例如:
email S1 S2 S3 Summation
a@mail.com 4 17 0 21
这是我的sql:
SELECT u.email as uEmail ,sum (a.score) as S1,sum(w.score) as S2,sum(boo.score) as S3,
sum(a.score + w.score + boo.score) as Summition
FROM user u
LEFT OUTER Join t1 a On u.email= a.email
LEFT OUTER Join t2 w On u.email=w.email
LEFT OUTER Join t3 boo On u.email=boo.email group by uEmail ;
我用S2得到错误的值,因为它应该只有4:
uEmail S1 S2 S3 Summition
a@mail.com 17 12
b@mail.com 3 5
我找到了删除分组的原因:
SELECT u.email as uEmail ,(a.score) as S1,(w.score) as S2,(boo.score) as S3,
(a.score + w.score + boo.score) as Summition
FROM user u
LEFT OUTER Join t1 a On u.email= a.email
LEFT OUTER Join t2 w On u.email=w.email
LEFT OUTER Join t3 boo On u.email=boo.email ;
每次重复得分值 4 :
uEmail S1 S2 S3 Summition
a@mail.com 2 4
a@mail.com 7 4
a@mail.com 8 4
b@mail.com 3 5
答案 0 :(得分:0)
尝试一下:
SELECT
u.`email`,
(SELECT SUM(`score`) FROM `t1` a WHERE a.`email` = u.`email`) as s1,
(SELECT SUM(`score`) FROM `t2` b WHERE b.`email` = u.`email`) as s2,
(SELECT SUM(`score`) FROM `t3` c WHERE c.`email` = u.`email`) as s3
FROM `users` u
我强烈建议不要将电子邮件用作外键。请改用users.id列。电子邮件可以更改,如果用户的电子邮件发生更改,您不必担心必须更新多个表中的所有相关行。
答案 1 :(得分:0)
这个也有s1 + s2 + s3的总和
select u.email, sum(s1) as S1, sum(s2) as S2, sum(s3) as S3, sum(s1+s2+s3) as Summation
from (select email, score as s1, 0 as s2, 0 as s3 from t1
union
select email, 0 as s1, score as s2, 0 as s3 from t2
union
select email, 0 as s1, 0 as s2, score as s3 from t3) s
left join user u
on u.email = s.email
group by u.email
order by u.email