MySQL在分组后获得第一个非空值
Posted
技术标签:
【中文标题】MySQL在分组后获得第一个非空值【英文标题】:MySQL get first non null value after group by 【发布时间】:2014-05-12 01:16:01 【问题描述】:我有一个大表,其中的数据不是唯一的,但必须是唯一的。该表是多个联合选择的结果,因此不是实际表。由于其他原因,我无法将其设为实际表格。
所有 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
这样的函数,但不幸的是它不存在。我有哪些选择?
【问题讨论】:
【参考方案1】:要选择第一个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;
【讨论】:
【参考方案2】:尝试使用MAX
,如下所示:
SELECT
email,
MAX(`name`)
FROM
(
SELECT
email,
`name`
FROM
multiple_tables_and_unions
) AS emails
GROUP BY email
【讨论】:
有时最简单的答案是最好的 :) 我一直认为 MAX 只适用于数字。谢谢 聪明人!喜欢它 小金块。老而金 但这会选择第一个非空值吗?我怀疑!它将按字母表选择最大值顺序。如果我们有 int 值而不是 string,它也会做同样的事情。 @JigneshM.Khatri OP 想要跳过 NULL 并选择一个非 NULL 值,而不是特别想要 MAX 值。以上是关于MySQL在分组后获得第一个非空值的主要内容,如果未能解决你的问题,请参考以下文章