数据库:mysql
版本:5.7.21
项目开发中 需要用到分组取最大行 试了很多种方法 网上的也看了很多种
这是和同事发现的 我觉得最好用一种
测试数据库:
DROP TABLE IF EXISTS `audit_record`;
CREATE TABLE `audit_record` (
`audit_record_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '表主键',
`entrust_department_id` bigint(20) NULL DEFAULT NULL COMMENT '任务表id',
`audit_record_person_id` bigint(20) NULL DEFAULT NULL COMMENT '处理人id',
`audit_record_person` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '处理人',
`audit_record_operation` enum('提交审核','通过审核','驳回审核','提交批准','通过批准','驳回批准','不出具报告','创建任务','报告打印','任务回滚') CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作',
`audit_record_time` datetime(0) NULL DEFAULT NULL COMMENT '处理时间',
`audit_record_remarks` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '批注',
PRIMARY KEY (`audit_record_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 365 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '记录表' ROW_FORMAT = Dynamic;
正常分组sql
SELECT
*
FROM
audit_record
GROUP BY
audit_record_operation
网上有种说法 在5点几版本之前 可以先子查询排序在分组 是可以的
但是 好像到5点几版本后这个方法失效了,网上有说在子查询里加 limit
这种方法是可以的 但是就是很不方便
这是 时无意中发现的 having 加到子查询里 也是可以使排序生效
分组取时间最大sql
如果有查询条件 可以直接加在 having前 不影响排序
SELECT
ar.*
FROM
( SELECT * FROM audit_record HAVING 1 ORDER BY audit_record_time DESC ) ar
GROUP BY
ar.audit_record_operation