2014-06-15 24 views
0

我有兩個表,我想要相互結合。在這一點上,我使用UNION將它們組合起來,它們完美地滿足我的所有需求,但只有一件事情。由於UNION用T2替換T1中的所有內容,因此T3.votes將爲0.但我不希望它爲0--我希望它保持T1.votes的狀態(不要介意T2只有四行長因爲我已經設法將這些結合在一起,但我只是沒有得到T3.votes來顯示T1.votes內容)。結合表內容,而'排除'MySQL中的給定列

我該如何做到這一點?澄清:除了T2.votes之外,一切都應該結合起來。

T1  
+-----------+-------+---------------+ 
| CANDIDATE | VOTES | RANKED_CHOICE | 
+-----------+-------+---------------+ 
|   1 |  8 |    0 | 
|   2 |  1 |    0 | 
|   3 |  2 |    0 | 
|   4 |  4 |    0 | 
|   5 |  2 |    0 | 
|   6 |  3 |    0 | 
+-----------+-------+---------------+ 

T2 
+-----------+-------+---------------+ 
| CANDIDATE | VOTES | RANKED_CHOICE | 
+-----------+-------+---------------+ 
|   2 |  0 |    4 | 
|   3 |  0 |    1 | 
|   4 |  0 |    2 | 
|   5 |  0 |    1 | 
+-----------+-------+---------------+ 

COMBINED TABLE AS I EXPECT IT TO BE (T3) 
+-----------+-------+---------------+ 
| CANDIDATE | VOTES | RANKED_CHOICE | 
+-----------+-------+---------------+ 
|   1 |  8 |    0 | 
|   2 |  1 |    4 | 
|   3 |  2 |    1 | 
|   4 |  4 |    2 | 
|   5 |  2 |    1 | 
|   6 |  3 |    0 | 
+-----------+-------+---------------+ 

回答

0

如果所有T1的候選人在T2中,則可以進行左連接。

select t1.candidate, max(t1.votes,ifnull(t2.votes,0)), max(t1.ranked_choice,ifnull(t2.ranked_choice,0)) 
from t1 left join t2 
on t1.candidate = t2.candidate; 

否則,您可以執行T1和T2的聯合作爲子查詢,並從此子查詢中獲取總數或最大投票數。

select candidate, sum(votes),max(ranked_choice) from 
(
select candidate,votes,ranked choice from t1 
union 
select candidate,votes,ranked choice from t2 
) sub 
group by candidate; 

編輯:有我在查詢兩個小錯誤 - 用最大的(),而不是MAX()和「排名選擇」之間的下劃線:

select t1.candidate, greatest(t1.votes,ifnull(t2.votes,0)) as votes, greatest(t1.ranked_choice,ifnull(t2.ranked_choice,0)) as rank 
from t1 left join t2 
on t1.candidate = t2.candidate; 

select candidate, sum(votes),max(ranked_choice) from 
(
select candidate,votes,ranked_choice from t1 
union 
select candidate,votes,ranked_choice from t2 
) sub 
group by candidate; 

兩個查詢產生期望的結果。

+0

這樣做是否真的讓T1.votes處於原始狀態? –