我需要按字段分组并填写缺少的信息(如有)。
例如,我们有一个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 | --------------------------------------------
谢谢。
答案 0 :(得分:0)
您必须明确“持续”的实际含义。插入的记录没有特定的顺序,因此您必须添加自动递增的ID或类似created_at
日期的数据。
然后,您可以使用以下方法选择正确的记录:
SELECT `name`, `description`
FROM `test`
GROUP BY `name`
HAVING `created_at` = MAX(`created_at`)
对于非空部分,您必须使用WHERE description<>''
对其进行过滤。