文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mysql分组排序取组内第一的数据行获取分组后,组内排名第一或最后的数据行。

2023-09-08 13:51

关注

前言:

group by函数后取到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢?

本文提供两种实现方式。

一、准备数据

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', '技术三部一组');

二、三种实现方式

1)先order by之后再分组:

SELECT * FROM (SELECT * from tb_dept ORDER BY id descLIMIT 10000) a GROUP BY parent_id;

不加LIMIT可能会无效,由于mysql的版本问题。但是总觉得这种写法不太正经,因为如果数据量大于Limit 的值后,结果就不准确了。所以就有了第二种写法。

2)利用max() 函数:

SELECT * FROM tb_dept td,(SELECT max(id) id FROM tb_dept GROUP BY parent_id) md where td.id = md.id;

3)利用 where 字段名称 in (...) 函数:

SELECT * FROM tb_dept WHERE id IN (SELECT MAX(id) FROM tb_dept GROUP BY parent_id);

-- 查找所有用户的最近失效订单 

SELECT A.* from
(
SELECT s.subId,userId,expiredTime from open_orderinfo_sub s
where expiredTime is not null and s.eaId=82 and s.`status`=0
ORDER BY expiredTime desc LIMIT 100000000
)A GROUP BY A.userId;

还有方式二:(查询create_time 最新的产品记录)

select * from table1 a where not exists (select 1 from table1 where product_id = a.product_id and create_time > a.create_time);

方式三:

select
a.product_id, a.task_id, a.user_id, a.type, a.status, a.content, a.create_time, a.update_time
from table_123 a
where create_time = (select max(create_time) from table_123 where product_id = a.product_id and `type`=a.type)

来源地址:https://blog.csdn.net/wxb880114/article/details/128801621

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯