Sql---获取分组数据
按条件取分组内前几条数据
示例
按照资讯分类分组,取每组的前3条资讯信息列表;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | CREATE TABLE `info` ( `id` int (11) NOT NULL AUTO_INCREMENT, `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `views` int (255) DEFAULT NULL, `info_type_id` int (11) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of info -- ---------------------------- INSERT INTO `info` VALUES (1, '中日海军演习' , 10, 4); INSERT INTO `info` VALUES (2, '美俄军事竞赛' , 22, 4); INSERT INTO `info` VALUES (3, '流浪地球电影大火' , 188, 1); INSERT INTO `info` VALUES (4, '葛优瘫' , 99, 2); INSERT INTO `info` VALUES (5, '周杰伦出轨了' , 877, 2); INSERT INTO `info` VALUES (6, '蔡依林西安演唱会' , 86, 1); INSERT INTO `info` VALUES (7, '中纪委调盐' , 67, 3); INSERT INTO `info` VALUES (8, '人民大会堂' , 109, 3); INSERT INTO `info` VALUES (9, '重庆称为网红城市' , 202, 1); INSERT INTO `info` VALUES (10, '胡歌结婚了' , 300, 2); INSERT INTO `info` VALUES (11, 'ipone15马上上市' , 678, 2); INSERT INTO `info` VALUES (12, '中国探月成功' , 54, 4); INSERT INTO `info` VALUES (13, '钓鱼岛对峙' , 67, 4); CREATE TABLE `info_type` ( `id` int (11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of info_type -- ---------------------------- INSERT INTO `info_type` VALUES (1, '娱乐' ); INSERT INTO `info_type` VALUES (2, '八卦' ); INSERT INTO `info_type` VALUES (3, '政治' ); INSERT INTO `info_type` VALUES (4, '军事' ); |
解决思路
GROUP BY 使用的各种方式都不能实现;
使用相关子查询(https://www.cnblogs.com/anpeiyong/p/16714963.html)
在查询 每条资讯记录时要是能查出其所在类型的排名,然后 根据排名字段进行过滤;
(要计算出 某条资讯信息的 在同资讯分类下所有记录中排第几名,换成算出 有多少条浏览量比当前记录的浏览量高,然后根据具体的多少(N)条+1 就是当前记录所在其分类下的的排名)
1 2 3 4 5 6 | SELECT c.* FROM ( SELECT *,( SELECT COUNT (*)+1 FROM info b WHERE b.info_type_id=a.info_type_id and b.views>a.views) top FROM info a ) c WHERE c. top <= 3 ORDER BY c.info_type_id,c. top |
结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)