首页 > 数据库 >基于mysql实现group by 取分组第一条 最后一条

基于mysql实现group by 取分组第一条 最后一条

时间:2022-11-18 12:59:37浏览次数:36  
标签:INSERT group INTO dept 分组 mysql VALUES tb id

测试数据

DROP TABLE IF EXISTS `tb_dept`;
CREATE TABLE `tb_dept`  (
  `id` bigint(20) UNSIGNED NOT NULL,
  `parent_id` bigint(20) NULL DEFAULT NULL,
  `dept_code` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `dept_name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_parent_id_code`(`parent_id`, `dept_code`) USING BTREE,
  INDEX `idx_code_parent_id`(`dept_code`, `parent_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;
 
 
INSERT INTO `tb_dept` VALUES (1, NULL, '01', '葫芦科技');
INSERT INTO `tb_dept` VALUES (2, 1, '001', '运营部');
INSERT INTO `tb_dept` VALUES (3, 1, '002', '技术部');
INSERT INTO `tb_dept` VALUES (4, 1, '003', '产品部');
INSERT INTO `tb_dept` VALUES (5, 1, '004', '设计部');
INSERT INTO `tb_dept` VALUES (6, 2, '00101', '运营一部');
INSERT INTO `tb_dept` VALUES (7, 2, '00102', '运营二部');
INSERT INTO `tb_dept` VALUES (8, 3, '00201', '技术一部');
INSERT INTO `tb_dept` VALUES (9, 3, '00202', '技术二部');
INSERT INTO `tb_dept` VALUES (10, 3, '00203', '技术三部');
INSERT INTO `tb_dept` VALUES (11, 3, '00204', '技术四部');
INSERT INTO `tb_dept` VALUES (12, 4, '00301', '运营一部');
INSERT INTO `tb_dept` VALUES (13, 4, '00302', '运营二部');
INSERT INTO `tb_dept` VALUES (14, 4, '00303', '运营三部');
INSERT INTO `tb_dept` VALUES (15, 5, '00401', '设计一部');
INSERT INTO `tb_dept` VALUES (16, 8, '0020101', '技术一部一组');
INSERT INTO `tb_dept` VALUES (17, 8, '0020102', '技术一部二组');
INSERT INTO `tb_dept` VALUES (18, 9, '0020201', '技术二部一组1111');
INSERT INTO `tb_dept` VALUES (19, 10, '0020301', '技术三部一组');

获取分组里的首条数据

SELECT
	*,
	GROUP_CONCAT( dept_code ) 
FROM
	tb_dept 
GROUP BY
	dept_name

sql语句后面跟不跟排序都不起作用 按默认asc排序 留首条

获取分组里的最后一条数据

  1. 先order by之后再分组(注意:不加LIMIT可能会无效,由于mysql的版本问题)
SELECT
	*,
	GROUP_CONCAT( dept_code ) 
FROM
	( SELECT * FROM tb_dept ORDER BY id DESC LIMIT 10000 ) a 
GROUP BY
	dept_name;

有缺点就是limit条件有局限性

  1. 利用max() 函数:(根据业务, max(id))
SELECT
	*
FROM
	tb_dept td,
	( SELECT max( id ) id FROM tb_dept GROUP BY dept_name ) md 
WHERE
	td.id = md.id;

SELECT
	* 
FROM
	tb_dept td,
	( SELECT max( id ) id, GROUP_CONCAT( dept_code ) FROM tb_dept GROUP BY dept_name ) md 
WHERE
	td.id = md.id;

  1. 利用 where 字段名称 in (...) 函数
SELECT
	* 
FROM
	tb_dept 
WHERE
	id IN ( SELECT MAX( id ) FROM tb_dept GROUP BY dept_name );

标签:INSERT,group,INTO,dept,分组,mysql,VALUES,tb,id
From: https://www.cnblogs.com/fuqian/p/16902821.html

相关文章

  • mysql8导入数据慢解决
    前提是mysql使用innodb引擎 先优化配置文件:innodb_buffer_pool_size=12Ginnodb_log_file_size  =1G#只能修改配置文件生效innodb_flush_log_at_trx_commit=......
  • Unix/Linux编程(MySQL数据库系统)
    1MySQL介绍MySQL是一个关系数据库系统在关系数据库中,数据存储在表中。每个表由多个行和列组成。表中的数据相互关联。表也可能与其他表有关联。关系结构使得可在表上运行......
  • mysql触发器 增删改
    --------------------------------eb_system_menus触发器编写--新增、修改、删除--自动执行eb_seller_menus--------------------------------delimiter$-......
  • 本地mysql端口3306 一直干不掉这样解决
    第一步:先whereis  mysql(查找到MySQL的一些本地文件)    主要删除这两个  再干掉端口3306 即可 ......
  • mysql无法启动且没有报任何错误
    1.大家使用mysql用了一段时间是不是会发现在任务管理器中启动mysql也不行,用cmd输入mysqlstartmysql和管理员身份以及在安装的bin目录下输入cmd来启动mysql启动无法成功......
  • Mysql : 出现Table ‘./mysql/proc’ is marked as crashed and should be repaired
    今天升级脚本出现的问题:Table‘./mysql/proc’ismarkedascrashedandshouldberepaired一般这种表崩溃的问题出现在mysql异常停止,或者使用kill-9命令强行杀掉进......
  • centos7 在线安装mysql 8.0
      1.下载mysqlrpm包安装源   https://dev.mysql.com/downloads/repo/yum/ (如图,注意选择对应的linux版本,文件10k左右;  或者右键复制链接地址,在服务......
  • MySQL中的多表操作
    MySQL多表操作1、联合查询联合查询:union,是指将多个查询结果合并成一个结果显示,联合查询是针对查询结果的合并(多条select语句合并)基本语法select查询[决定字段......
  • 25-mysql服务器集群搭建
    25-mysql集群搭建【高可用将会在26章发出】主从架构和原理MySQL的主从复制读写分离复制:每个节点都有相同的数据集,向外扩展,基于二进制日志的单向复制复制的作用负载均衡读操......
  • 【MySQL】MySQL复制与高可用水平扩展架构实战
    本文导读本文简单介绍几种复制方式复制在生产中解决的实际问题,MySQL复制的配置流程和MySQL复制类型,不会深入到 MTBF、MTTR平均故障间隔、平均修复时间等等以及MMM集群架构......