MySQL分组填补空白

时间:2018-07-30 01:55:23

标签: mysql

我需要按字段分组并填写缺少的信息(如有)。

例如,我们有一个test表:

CREATE TEMPORARY TABLE `test` (
    `name` VARCHAR(100), `description` VARCHAR(100)
);

对于此表,我们有以下记录:

INSERT INTO `test` (`name`, `description`, `email`)
VALUES ('John', '', ''),
VALUES ('John', 'Description #1', ''),
VALUES ('John', 'Description #2', ''),
VALUES ('John', '', 'john@example.com'),
VALUES ('John', '', '');

我需要选择该表上按name分组的所有条目,并填充空白,例如description(在这种情况下,它应使用“说明#2”,因为它是最新的非description为空值。email也是如此,它应返回'john@example.com'。

我应该如何选择这些值? PS:实际表中有几列,因此最好不要修改SELECT语句。

我当前的选择是:

SELECT `name`, `description` FROM `test` GROUP BY `name`;

问题在于它将始终使用第一个出现的值。我需要基于最新的非空插入来“合并”所有值。

每个列最终可能会使用来自不同条目的值。

预期输出:

____________________________________________
| name | description    | email            |
--------------------------------------------
| John | Description #2 | john@example.com |
--------------------------------------------

谢谢。

1 个答案:

答案 0 :(得分:0)

您必须明确“持续”的实际含义。插入的记录没有特定的顺序,因此您必须添加自动递增的ID或类似created_at日期的数据。

然后,您可以使用以下方法选择正确的记录:

  SELECT `name`, `description`
    FROM `test`
GROUP BY `name`
  HAVING `created_at` = MAX(`created_at`)

对于非空部分,您必须使用WHERE description<>''对其进行过滤。