【问题标题】:MySQL get first non null value after group byMySQL在分组后获得第一个非空值
【发布时间】: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

我已从临时表中删除代码,因为它包含许多表,但都选择了 emailname 列。本质上我需要一个像GROUP_COALESCE 这样的函数,但不幸的是它不存在。我有哪些选择?

【问题讨论】:

    标签: mysql group-by group-concat


    【解决方案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 值。
      猜你喜欢
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 2020-09-04
      • 2013-07-03
      • 2012-06-24
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多