MySql分组查询数据,包含any_value()取值

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()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码奴生来只知道前进~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值