2014-04-01 40 views
20

我有一個大表,其中的數據不是唯一的,而是需要的。該表是多重聯合選擇的結果,因此不是實際的表。由於其他原因,我無法將其作爲實際表格。MySQL通過組獲得第一個非空值

所有UNION表格都有一個電子郵件列,它最終將是唯一的。得到的記錄是這樣的:

1 [email protected] Ozzy 
2 [email protected] Tony 
3 [email protected] Steve 
4 [email protected] 
13 [email protected] Tony 
14 [email protected] Ozzy 
15 [email protected] Dave 
16 [email protected] Tim 

正如你所看到的,一些電子郵件,其中包含不同的名稱或不存在的名字出現更多然後一次。當我在最後加一個GROUP BY email條款,結果是這樣的:

1 [email protected] Ozzy 
2 [email protected] Tony 
3 [email protected] Steve 
4 [email protected] 
13 [email protected] Tony 

正如你可以看到,電子郵件4沒有一個名字,因爲它選擇了與NULL第一條目的名稱。然後我試圖使用GROUP_CONCAT這使得結果是這樣的:

1 [email protected] Ozzy 
14 [email protected] Ozzy,Tony 
15 [email protected] Dave,Steve 
16 [email protected] Tim 
13 [email protected] Tony 

正如你所看到的,現在每個人都有一個名字,但一些行有一個以上的名字串連。我想要做的是GROUP BY email,並選擇每行的第一項NOT NULL每列的,從理論上看,像這樣:

1 [email protected] Ozzy 
2 [email protected] Tony 
3 [email protected] Steve 
4 [email protected] Tim 
13 [email protected] Tony 

我一直在使用COALESCE嘗試,但它不工作按預期。我目前的查詢看起來像這樣:

SELECT 
    id, 
    email, 
    `name` 
FROM 
(
    SELECT 
     email, 
     `name` 
    FROM 
     multiple_tables_and_unions 
) AS emails 

GROUP BY email 

我已刪除臨時表的代碼,因爲它包含了許多表,但所有選擇emailname列。基本上我需要一個像GROUP_COALESCE這樣的函數,但不幸的是它不存在。我有什麼選擇?

感謝

回答

26

嘗試使用MAX,像這樣:

SELECT 
    email, 
    MAX(`name`) 
FROM 
(
    SELECT 
     email, 
     `name` 
    FROM 
     multiple_tables_and_unions 
) AS emails 

GROUP BY email 
+3

有時候,最簡單的回答是最好的:)我一直認爲MAX的工作只在數字。謝謝 – Ozzy

+0

哈哈真的嗎?很棒! – daVe

+0

聰明的一個!喜歡它 –