MySQL获取group by之后的第一个非空值

MySQL获取group by之后的第一个非空值,mysql,group-by,group-concat,Mysql,Group By,Group Concat,我有一个很大的表,其中包含的数据不是唯一的,但必须是唯一的。此表是多次联合选择的结果,因此不是实际的表。由于其他原因,我不能把它做成一张真正的桌子 所有联合表格都有一个电子邮件列,该列最终将是唯一的。生成的记录如下所示: 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

我有一个很大的表,其中包含的数据不是唯一的,但必须是唯一的。此表是多次联合选择的结果,因此不是实际的表。由于其他原因,我不能把它做成一张真正的桌子

所有联合表格都有一个电子邮件列,该列最终将是唯一的。生成的记录如下所示:

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
1   ozzy@test.com   Ozzy
2   test@test.com   Tony
3   test@yahoo.com  Steve
4   tiny@test.com   
13  tony@gmail.com  Tony
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
SELECT
    email,
    MAX(`name`)
FROM
(
    SELECT
        email,
        `name`
    FROM
        multiple_tables_and_unions
) AS emails

GROUP BY email
正如你所看到的,有些电子邮件会多次出现,并使用不同的名称或不存在的名称。当我在末尾添加
groupbyemail
子句时,结果如下所示:

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
1   ozzy@test.com   Ozzy
2   test@test.com   Tony
3   test@yahoo.com  Steve
4   tiny@test.com   
13  tony@gmail.com  Tony
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
SELECT
    email,
    MAX(`name`)
FROM
(
    SELECT
        email,
        `name`
    FROM
        multiple_tables_and_unions
) AS emails

GROUP BY email
如您所见,电子邮件4没有名称,因为它选择了第一个带有
NULL
的条目作为名称。然后我尝试使用
GROUP\u CONCAT
,结果如下:

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
1   ozzy@test.com   Ozzy
2   test@test.com   Tony
3   test@yahoo.com  Steve
4   tiny@test.com   
13  tony@gmail.com  Tony
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
SELECT
    email,
    MAX(`name`)
FROM
(
    SELECT
        email,
        `name`
    FROM
        multiple_tables_and_unions
) AS emails

GROUP BY email
如您所见,现在每个人都有一个名称,但有些行连接了多个名称。我想做的是
通过电子邮件分组
,然后为每行选择每列的第一个
非空
条目,理论上看起来是这样的:

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\u COALESCE
的函数,但不幸的是它并不存在。我的选择是什么?

尝试使用
MAX
,如下所示:

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
1   ozzy@test.com   Ozzy
2   test@test.com   Tony
3   test@yahoo.com  Steve
4   tiny@test.com   
13  tony@gmail.com  Tony
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
SELECT
    email,
    MAX(`name`)
FROM
(
    SELECT
        email,
        `name`
    FROM
        multiple_tables_and_unions
) AS emails

GROUP BY email

要选择第一个
non-null
值,
GROUP\u CONCAT
在这里很方便。下面是一个例子:

SELECT
    email,
    SUBSTRING_INDEX(GROUP_CONCAT(`name`), ',',1)
FROM
(
    SELECT
        email,
        `name`
    FROM
        multiple_tables_and_unions
) AS emails

GROUP BY email;

有时最简单的答案是最好的:)我一直认为MAX只研究数字。谢谢你!就像小金块一样。虽然很旧,但这会选择第一个非空值吗?我怀疑!它将按字母选择最大值顺序。如果我们用int值代替string,它也会这样做。@JigneshM.Khatri OP想要跳过NULL并选择一个非NULL值,而不是特别想要最大值。