打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
mysql分组取每组前几条记录
作者:caicai1171523597 时间: 2021-02-05 10:05:39
【摘要】项目中经常会遇到对数据进行分组排序并取前N条的需求,比如有一张资讯表如下 CREATE TABLE `test_news` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `title` varchar(100) DEFAULT NULL COMMENT '文章标题',  `content` longtext COMMENT '文章内容',  `...

项目中经常会遇到对数据进行分组排序并取前N条的需求,比如有一张资讯表如下

CREATE TABLE `test_news` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `title` varchar(100) DEFAULT NULL COMMENT '文章标题',  `content` longtext COMMENT '文章内容',  `channel` int(11) DEFAULT NULL COMMENT '文章频道',  `status` int(11) DEFAULT NULL COMMENT '状态,1正常,0关闭', `create_time` datetime DEFAULT NULL COMMENT '文章发布时间',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=513 DEFAULT CHARSET=utf8;

文章分为多个频道,比如体育新闻、娱乐新闻、财经新闻、汽车新闻等多个频道,现在要求取出每种类型的最新的前5条新闻,避免多次进行数据库连接我们肯定不能每种类型都单独去请求数据库查询,假如种类不多的话我们可以分别查出每种新闻的前5条然后使用union all进行合并,这样也只需要进行一次数据库连接,除了这种方法还有以下两种方法。
方法一:
由于设置了表的id自增,所以最新的资讯可以根据id来倒序查也可根据创建时间create_time来进行倒序,这里采用的id,要取5条最新资讯,所以查询的count需要小于5

思路:遍历所有资讯与当前资讯做比较,同一频道且相同状态的资讯不超过5个当前的id大,那么这条资讯才算最新的前5条

SELECT id, title, channel, create_timeFROM test_news AS aWHERE ( SELECT count(1) FROM test_news AS b WHERE a.channel = b.channel AND a. STATUS = b. STATUS AND a.id < b.id ) < 5ORDER BY a.channel ASC, a.id DESC;

方法二:

SELECT a.id, a.title, a.channel, a.create_timeFROM test_news AS aLEFT JOIN test_news AS b ON a.channel = b.channelAND a. STATUS = b. STATUSAND a.id < b.idWHERE a. STATUS = 1GROUP BY a.channel, a.idHAVING count(1) < 5ORDER BY a.channel ASC, a.id DESC;
方法一查询结果
方法二查询结果
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
RabbitMQ (九) 消息的参数详解
jQuery+ThinkPHP+Ajax实现即时消息提醒功能
【竺】数据库笔记13——mysql 创建表的同时创建索引
biweb添加字段
MySQL分组查询后如何获取每组的前N条数据,你会吗?
稳!从Oracle迁移到PG该注意的要点都讲透了
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服