mysql分组后获取每组前多少条数据
MySQL 分组后取每组前N条数据 - 人情世故 - 博客园
·
在项目中遇到一个问题,就是对表中的数据分类,然后对每一类的结果排序,获取指定的前多少条数据,或者最后几条数据。找了好久,终于找到一个相对合适但是不是很完美的方法。
表:
CREATE TABLE `demo_user` (
`id` varchar(100) NOT NULL,
`name` varchar(100) CHARACTER NOT NULL,
`age` int DEFAULT NULL,
`address` varchar(100) DEFAULT NULL,
`create_time` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
数据:
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('2', 'zhong', 1, 'gsgfsfgs', '2021-12-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('3', 'zhong', 12, 'gsgfsfgs', '2021-11-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('1', 'zhong', 12, 'gsgfsfgs', '2021-12-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('4', 'zhong', 15, 'gsgfsfgs', '2021-10-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('5', 'li', 12, 'gsgfsfgs', '2021-12-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('6', 'li', 1, 'gsgfsfgs', '2021-11-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('7', 'li', 2, 'gsgfsfgs', '2021-10-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('8', 'li', 120, 'gsgfsfgs', '2021-10-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('9', 'wang', 12, 'gsgfsfgs', '2021-12-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('10', 'wang', 3, 'gsgfsfgs', '2021-11-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('11', 'wang', 5, 'gsgfsfgs', '2021-12-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('12', 'wang', 3, 'gsgfsfgs', '2021-11-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('13', 'huang', 1, 'gsgfsfgs', '2021-12-10 12:12:12');
INSERT INTO zhong_test_2.demo_user
(id, name, age, address, create_time)
VALUES('14', 'huang', 12, 'gsgfsfgs', '2021-10-10 12:12:12');
语句:
select * from zhong_test_2.demo_user origin
where 2 > ( select count(*) from zhong_test_2.demo_user du where du.name = origin .name and du.age > origin.age)
order by origin.age desc;
解析:
2 > : 表示获取每一类的数据的条数
du.name = origin .name : 表示分组依据,按照name分组
du.age > origin.age : 排序方式,也就是获取前多少数据或者倒数多少条数据。> 表述获取前多少条数据,< 表示获取倒数多少条数据。
取前两名
select * from zhong_test_2.demo_user origin
where 2 > ( select count(*) from zhong_test_2.demo_user du where du.name = origin .name and du.age > origin.age)
order by origin.age desc;
取后两名:
select * from zhong_test_2.demo_user origin
where 2 > ( select count(*) from zhong_test_2.demo_user du where du.name = origin .name and du.age < origin.age)
order by origin.age desc;
其他:
当前几名/后几名中有相同的age时可能会获取到超过指定条数的数据。例如 age=120,12,12,11,取前两名(120,12,12)或者后两名(12,12,11)都会获取到三条数据,这个需要注意是否符合自己的需要。
更多推荐
所有评论(0)