原创

SQL用group by 分组后组内排序。

首先,感谢江峰同志提供的问题!让我再一次提升了下自己!

标题的需求。先根据某字段分组,再在组内按照某一字段进行排序,排序后获取符合条件的一条记录,其他不符合舍弃掉。

案例如下:

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `chinese` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

-- ----------------------------
-- 插入数据
-- ----------------------------
INSERT INTO `test` VALUES ('1', '1', '2019-09-24 15:02:41', '50');
INSERT INTO `test` VALUES ('2', '1', '2019-09-25 15:03:06', '60');
INSERT INTO `test` VALUES ('3', '2', '2019-09-11 15:03:19', '20');
INSERT INTO `test` VALUES ('4', '2', '2019-09-18 15:03:30', '28');
INSERT INTO `test` VALUES ('5', '2', '2019-09-25 15:03:41', '50');
INSERT INTO `test` VALUES ('6', '3', '2019-09-10 15:03:52', '70');
INSERT INTO `test` VALUES ('7', '4', '2019-09-25 15:04:02', '30');
INSERT INTO `test` VALUES ('8', '1', '2019-09-04 15:04:14', '20');
INSERT INTO `test` VALUES ('9', '4', '2019-09-25 15:03:06', '20');

要求:获取所有的不同user_id下,最新的一条记录。(查询出每个user_id最最新的一条记录)

方法一
SELECT
    t1.*
FROM
    test t1 where (
        SELECT
            COUNT(*)
        FROM
            test t2
        WHERE
            t1.user_id = t2.user_id
        AND t2.create_time >= t1.create_time
    ) < 2
GROUP BY
    t1.user_id

查询结果如下:
file

方法二

SELECT
    t1.*
FROM
    test t1 where (
        SELECT
            COUNT(*)
        FROM
            test t2
        WHERE
            t1.user_id = t2.user_id
        AND t2.create_time >= t1.create_time
    ) < 2
ORDER BY
    t1.create_time desc

查询结果如下:
file

对比一下,这两个结果其实相同的。都获取到了预期的结果。

参考文章 1:
https://www.cnblogs.com/hxfcodelife/p/10226934.html
这篇文章后面提到的使用row_number()的方式,但是博主了解到mysql并没有这个函数,所以参照了第一个方法,也顺利的得到了正确的结果。
参考文章2(使用row_number的方式,博主能力有限,没有实现):
https://www.jianshu.com/p/32e8c40372b3
https://blog.csdn.net/u010024991/article/details/69372207
https://blog.csdn.net/Chao_Qing/article/details/88908399
参考文章3:
https://blog.csdn.net/qb170217/article/details/82816704
这篇文章没有看懂,麻烦看懂的大佬解释下。。。。小弟在此感谢。

其中看到百度知道上,有人说使用MAX函数可以实现,如下图

file
这个结果并不是我们想要的结果,max值获取的仅仅是该组中某个字段的最大/最小值

在此小弟希望看到的大佬能提供其他的解决方案,小弟在此感激不尽。共同学习,共同进步!

正文到此结束(点击广告是对作者最大的支持)