使用LEFT OUTER Join查找多个表的字段汇总MYSQL

时间:2017-04-20 23:16:41

标签: mysql sql

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

所有表都有一个名为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   

2 个答案:

答案 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