Mysql 使用左外联接查找多个表的字段总和

Mysql 使用左外联接查找多个表的字段总和,mysql,sql,Mysql,Sql,我有几个表,让我们假设三个表+用户表 所有表都有一个外键email和一个score字段 用户: id email 1 a@mail.com 2 b@email.com id email score 1 a@mail.com 2 2 a@mail.com 7 3 a@mail.com 8 4 b@mail.com 3 id email score 1 a@mail.com 4 id email score 1 b@ma

我有几个表,让我们假设三个表+用户表

所有表都有一个外键email和一个score字段

用户:

id    email
1     a@mail.com
2     b@email.com
id  email   score
1   a@mail.com  2
2   a@mail.com  7
3   a@mail.com  8
4   b@mail.com  3
id  email   score
1   a@mail.com  4
id  email   score
1   b@mail.com  5
    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 ;
t1:

id    email
1     a@mail.com
2     b@email.com
id  email   score
1   a@mail.com  2
2   a@mail.com  7
3   a@mail.com  8
4   b@mail.com  3
id  email   score
1   a@mail.com  4
id  email   score
1   b@mail.com  5
    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 ;
t2:

id    email
1     a@mail.com
2     b@email.com
id  email   score
1   a@mail.com  2
2   a@mail.com  7
3   a@mail.com  8
4   b@mail.com  3
id  email   score
1   a@mail.com  4
id  email   score
1   b@mail.com  5
    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 ;
t3:

id    email
1     a@mail.com
2     b@email.com
id  email   score
1   a@mail.com  2
2   a@mail.com  7
3   a@mail.com  8
4   b@mail.com  3
id  email   score
1   a@mail.com  4
id  email   score
1   b@mail.com  5
    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 ;
我想从三个表中找出每个用户得分的总和, 例如:

这是我的sql:

id    email
1     a@mail.com
2     b@email.com
id  email   score
1   a@mail.com  2
2   a@mail.com  7
3   a@mail.com  8
4   b@mail.com  3
id  email   score
1   a@mail.com  4
id  email   score
1   b@mail.com  5
    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   
我在删除group by时找到了原因:

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   
尝试一下:

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列。电子邮件可能会更改,如果用户的电子邮件发生更改,您不希望不得不更新多个表中所有相关行的头痛问题。

尝试一下:

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列。电子邮件可以更改,如果用户的电子邮件发生更改,您不希望不得不更新多个表中所有相关行的头痛问题。

此电子邮件还有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

这个也有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

首先,使用电子邮件作为外键是一个非常糟糕的主意。您应该使用用户表中的id列。您的查询应该只在用户的表上,子选择从每个表收集分数。是的,我应该使用id,我将尝试进行子选择。谢谢汉克斯,这是工作!首先,使用电子邮件作为外键是一个非常糟糕的主意。您应该使用用户表中的id列。您的查询应该只在用户的表上,子选择从每个表收集分数。是的,我应该使用id,我将尝试进行子选择。谢谢汉克斯,这是工作!太好了,谢谢!霍尔希德:太好了,谢谢!霍尔希德