1、创建表和插入数据
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for project_node
-- ----------------------------
DROP TABLE IF EXISTS `project_node`;
CREATE TABLE `project_node` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`project_id` bigint(20) NULL DEFAULT NULL COMMENT '项目ID',
`main_node_type` int(3) NULL DEFAULT NULL COMMENT '主节点类型\r\n0-项目主节点\r\n1-立项审批\r\n2-政府采购\r\n3-项目建设\r\n4-初验管理\r\n5-终验管理',
`new_node` int(3) NULL DEFAULT NULL COMMENT '当前节点数值',
`create_user` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_user` bigint(20) NULL DEFAULT NULL COMMENT '更新人',
`update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '项目流程-节点位置' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of project_node
-- ----------------------------
INSERT INTO `project_node` VALUES (1, 124, 1, 4, 1, '2022-03-28 14:08:23', 763256, '2022-04-14 15:18:52');
INSERT INTO `project_node` VALUES (2, 125, 0, 2, 1, '2022-03-28 14:11:14', 1, '2022-04-14 15:18:52');
INSERT INTO `project_node` VALUES (3, 125, 1, 7, 1, '2022-03-28 14:12:41', 763256, '2022-04-14 15:18:52');
INSERT INTO `project_node` VALUES (4, 123, 0, 1, 1, '2022-03-28 14:57:04', 1, '2022-04-14 15:18:52');
INSERT INTO `project_node` VALUES (5, 126, 0, 2, 1, '2022-03-28 16:17:55', 1, '2022-04-14 15:18:52');
INSERT INTO `project_node` VALUES (6, 126, 1, 2, 1, '2022-03-28 16:20:30', 763256, '2022-04-14 15:18:52');
INSERT INTO `project_node` VALUES (7, 127, 0, 1, 1, '2022-03-28 18:08:52', NULL, '2022-04-14 15:18:52');
INSERT INTO `project_node` VALUES (8, 127, 1, 2, 1, '2022-03-28 18:09:38', NULL, '2022-04-14 15:18:52');
INSERT INTO `project_node` VALUES (9, 100, 5, 6, 763256, '2022-03-29 11:11:57', NULL, '2022-04-14 15:18:52');
INSERT INTO `project_node` VALUES (10, 135, 5, 6, 763256, '2022-03-29 11:11:57', NULL, '2022-04-14 15:18:52');
SET FOREIGN_KEY_CHECKS = 1;
查询数据为:所有的项目
2、不同方法实现
2.1 DISTINCT去除重复
SELECT
DISTINCT project_id
FROM
`project_node`
ORDER BY project_id desc
2.2 根据项目ID使用 group by进行分组
2.2.1只取项目ID字段不会存在问题
SELECT
project_id
FROM
project_node
GROUP BY
project_id ORDER BY id desc
2.2.2 如果需要取其他字段的值,使用any_value(字段)函数
SELECT
any_value(id) as id,
project_id,
any_value(main_node_type) as main_node_type,
any_value(new_node) as new_node
FROM
project_node
GROUP BY
project_id ORDER BY id desc;
重点:any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据
问题出现了,如果需要取其他字段的值,any_value()取的多条记录第一条数据的字段,导致数据可能存在问题。如下图:
2.2.3 通过获取最大的数据ID然后在查询
SELECT * FROM project_node WHERE id in(SELECT max(id) FROM project_node GROUP BY project_id)
3、总结
1、MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默认设置为打开状态。
2、ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值。
3、MySQL提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝。
4、any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据。