MySQL 通过选择最完整的记录来分组

标签 mysql

我有一个这样的记录列表:

id    state   description   date
3340  KO      test          2016-07-27
3340  KO                    2016-07-27
3340  AQ      blalba        2016-07-27
3340  AC                    2016-07-27

我需要按状态分组,选择重复状态记录之间最完整的记录,如下所示:

id    state   description   date
3340  KO      test          2016-07-27
3340  AQ      blalba        2016-07-27
3340  AC                    2016-07-27

最佳答案

这种解决方法可以帮助您获得预期的结果:

SET @row_number = 0;

SELECT id, `state`, `description`, `date`
FROM (
    SELECT *, (@row_number:=@row_number + 1) AS num
    FROM TestTable
    ORDER BY IF (`description` <> '', 0, 1)
    ) T
GROUP BY id, `state`

Working DEMO

使用给定数据执行示例:

CREATE TABLE TestTable(id INT, `state` VARCHAR(2), `description` VARCHAR(100), `date` DATE);

INSERT INTO TestTable (id, `state`, `description`, `date`) VALUES
(3340, 'KO', ''       , '2016-07-27'),
(3340, 'KO', 'test'   , '2016-07-27'),
(3340, 'AQ', 'blalba' , '2016-07-27'),
(3340, 'AC', ''       , '2016-07-27');

SET @row_number = 0;

SELECT id, `state`, `description`, `date`
FROM (
    SELECT *, (@row_number:=@row_number + 1) AS num
    FROM TestTable
    ORDER BY IF (`description` <> '', 0, 1)
    ) T
GROUP BY id, `state`

关于MySQL 通过选择最完整的记录来分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38614678/

相关文章:

mysql - SQL 帮助 - 根据特定日期的最高得分获取前 5 位用户

mysql - SQL 查询中的时间周期问题。

mysql - 包 MySql.Data 6.9.8 与 netcoreapp1.0 不兼容

MySQL - 如何确定我的表是否存储在 RAM 中?

java - 将 String 转换为 int 或 MySQL 中的默认整数

php - CodeIgniter - MySQL 错误 1064(更新 table1 内连接 table2(...))

php - 如何将.doc文件内容插入mysql表

mysql - 统计每个月的病人

php - 数据表警告 : table id=dataTables - Ajax error. 404 未找到

php - 检查用户是否在不到两分钟的时间内上传了更多或恰好 50 个文件 MySQL