Mysql 使用左外联接查找多个表的字段总和
我有几个表,让我们假设三个表+用户表 所有表都有一个外键email和一个score字段 用户: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
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,我将尝试进行子选择。谢谢汉克斯,这是工作!太好了,谢谢!霍尔希德:太好了,谢谢!霍尔希德