MySQL在group by之后获得第一个非null值

Ozz*_*zzy 31 mysql group-by group-concat

我有一个大表,数据不是唯一但需要.此表是多个联合选择的结果,因此不是实际表.由于其他原因,我不能把它变成一张真正的桌子.

所有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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,有些电子邮件会以不同的名称或不存在的名称出现.当我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
Run Code Online (Sandbox Code Playgroud)

如您所见,电子邮件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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,现在每个人都有一个名称,但有些行有多个名称已连接.我想要做的是GROUP BY emailNOT 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
Run Code Online (Sandbox Code Playgroud)

我尝试过使用COALESCE但它没有按预期工作.我当前的查询如下所示:

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

GROUP BY email
Run Code Online (Sandbox Code Playgroud)

我已从临时表中删除了代码,因为它包含许多表,但都选择了emailname列.基本上我需要一个功能,GROUP_COALESCE但不幸的是它不存在.我有什么选择?

谢谢

Azi*_*ikh 41

尝试使用MAX,像这样:

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

GROUP BY email
Run Code Online (Sandbox Code Playgroud)

  • 有时最简单的答案是最好的:)我一直认为MAX只适用于数字.谢谢 (3认同)
  • 但这会选择第一个非空值吗?我怀疑!它将按字母顺序选择最大值。如果我们有 int 值而不是字符串,它也会做同样的事情。 (3认同)