2017-04-20 10 views
1

我有幾個表,我們假設三個表+用戶表。使用LEFT OUTER加入找到多個表的字段提示MYSQL

所有表都有一個稱爲電子郵件和分數字段的外鍵。

用戶:

id email 
1  [email protected] 
2  [email protected] 

T1:

id email score 
1 [email protected] 2 
2 [email protected] 7 
3 [email protected] 8 
4 [email protected] 3 

T2:

id email score 
1 [email protected] 4 

噸3:

id email score 
1 [email protected] 5 

我想從三個表中找到每個用戶分數的總和, 例如:

email   S1 S2 S3 Summation 
[email protected]  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 
[email protected] 17 12  
[email protected] 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 ; 

分數的值的值重複每次:

uEmail  S1 S2 S3 Summition 
[email protected] 2 4  
[email protected] 7 4  
[email protected] 8 4 
[email protected] 3  5 
+0

首先,使用電子郵件作爲外鍵是一個非常糟糕的主意。您應該使用用戶表中的id列。你的查詢應該在用戶的表上,子選擇從每個表中收集得分。 –

+0

是的,我應該用id來代替,我會盡量做出子選擇。謝謝 – khorshid

+0

謝謝,它的工作! – khorshid

回答

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 
+0

它就像一個魅力工作! – khorshid

+0

太好了,謝謝! khorshid – Chuck

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列。電子郵件可能會改變,如果用戶的電子郵件發生更改,您不必更新多個表中的所有相關行。