我有一个大表,数据不是唯一但需要。此表是多个联合选择的结果,因此不是实际表。由于其他原因,我不能把它变成一张真正的桌子。
所有UNION表都有一个电子邮件列,最终将是唯一的。结果记录如下所示:
1 ozzy@test.com Ozzy
2 test@test.com Tony
3 test@yahoo.com Steve
4 tiny@test.com
13 tony@gmail.com Tony
14 test@test.com Ozzy
15 test@yahoo.com Dave
16 tiny@test.com Tim
正如您所看到的,有些电子邮件会以不同的名称或不存在的名称出现。当我在最后添加GROUP BY email
子句时,结果如下所示:
1 ozzy@test.com Ozzy
2 test@test.com Tony
3 test@yahoo.com Steve
4 tiny@test.com
13 tony@gmail.com Tony
如您所见,电子邮件4没有名称,因为它选择了第一个带有NULL
的条目作为名称。然后我尝试使用GROUP_CONCAT
,结果如下所示:
1 ozzy@test.com Ozzy
14 test@test.com Ozzy,Tony
15 test@yahoo.com Dave,Steve
16 tiny@test.com Tim
13 tony@gmail.com Tony
正如您所看到的,现在每个人都有一个名字,但有些行有多个名称已经连接。我想要做的是GROUP BY email
并从理论上看每行选择每列的第一个NOT NULL
条目:
1 ozzy@test.com Ozzy
2 test@test.com Tony
3 test@yahoo.com Steve
4 tiny@test.com Tim
13 tony@gmail.com Tony
我尝试过使用COALESCE
但它没有按预期工作。我当前的查询如下:
SELECT
id,
email,
`name`
FROM
(
SELECT
email,
`name`
FROM
multiple_tables_and_unions
) AS emails
GROUP BY email
我已从临时表中删除了代码,因为它包含许多表,但都选择了email
和name
列。基本上我需要一个像GROUP_COALESCE
这样的函数,但不幸的是它不存在。我有什么选择?
由于
答案 0 :(得分:38)
尝试使用MAX
,如下所示:
SELECT
email,
MAX(`name`)
FROM
(
SELECT
email,
`name`
FROM
multiple_tables_and_unions
) AS emails
GROUP BY email
答案 1 :(得分:0)
要选择第一个 non null
值,GROUP_CONCAT
在这里很方便。示例如下:
SELECT
email,
SUBSTRING_INDEX(GROUP_CONCAT(`name`), ',',1)
FROM
(
SELECT
email,
`name`
FROM
multiple_tables_and_unions
) AS emails
GROUP BY email;