2014-04-01 43 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

聪明的一个!喜欢它 –