MySQL获取所有分类的前N条记录


Posted in MySQL onMay 07, 2021

比如有文章表 Article(Id,Category,InsertDate),现在要用SQL找出每种类型中时间最新的前N个数据组成的集合,一段不错的代码,留存备用

SELECT A1.* 
FROM Article AS A1 
   INNER JOIN (SELECT A.Category,A.InsertDate 
         FROM Article AS A 
           LEFT JOIN Article AS B 
            ON A.Category = B.Category 
              AND A.InsertDate <= B.InsertDate 
         GROUP BY A.Category,A.InsertDate 
         HAVING COUNT(B.InsertDate) <= @N 
  ) AS B1 
  ON A1.Category = B1.Category 
    AND A1.InsertDate = B1.InsertDate 
ORDER BY A1.Category,A1.InsertDate DESC

@N 就是你要取多少条

下面是我用到了一个产品分类表中,superId是大分类,prcid是产品分类。能用SQL完成的功能就要尽量用SQL语句来完成,这既简洁又高效。

SELECT
  A1.*
FROM
  prcKx AS A1
INNER JOIN (
  SELECT
    A.superId,
    A.prcid
  FROM
    prcKx AS A
  LEFT JOIN prcKx AS B ON A.superId = B.superId
  AND A.prcid <= B.prcid
  GROUP BY
    A.superId,
    A.prcid
  HAVING
    COUNT(B.prcid) <= 7
) AS B1 ON A1.superId = B1.superId
AND A1.prcid = B1.prcid
ORDER BY
  superId,
  prcid

需求是这样的(CSDN上的一个问题):mysql中有个表:article(字段:id,type,date),type有1-10,10种类型。现在要用SQL找出每种类型中时间最新的前N个数据组成的集合。

这个问题应该有很多方法可以实现,下面就来说说在网上看到的一位高手的实现(用一条SQL语句实现的,个人感觉非常好,所以拿来和大家分享): 

select a1.* from article a1
inner join
(select a.type,a.date from article a left join article b
on a.type=b.type and a.date<=b.date 
group by a.type,a.date
having count(b.date)<=2
)b1
on a1.type=b1.type and a1.date=b1.date
order by a1.type,a1.date desc

注:上面sql语句中的2代表的就是前面提到的N。

以上所述就是本文的全部内容了,希望大家能够喜欢。

MySQL 相关文章推荐
MySQL锁机制
Apr 05 MySQL
mysql字符串截取函数小结
Apr 05 MySQL
Windows10下安装MySQL8
Apr 06 MySQL
详解MySQL事务的隔离级别与MVCC
Apr 22 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
JMeter对MySQL数据库进行压力测试的实现步骤
Jan 22 MySQL
MySQL数据库如何使用Shell进行连接
Apr 12 MySQL
mysql数据库实现设置字段长度
Jun 10 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 MySQL
mysql函数之截取字符串的实现
Aug 14 MySQL
教你解决往mysql数据库中存入汉字报错的方法
MySQL时间设置注意事项的深入总结
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 #MySQL
MySQL创建高性能索引的全步骤
将图片保存到mysql数据库并展示在前端页面的实现代码
MySQL的join buffer原理
Apr 29 #MySQL
Mysql服务添加 iptables防火墙策略的方案
Apr 29 #MySQL
You might like
消息持续发送的完整例子
2006/10/09 PHP
PHP面向对象的使用教程 简单数据库连接
2006/11/25 PHP
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
PHP进程同步代码实例
2015/02/12 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
Javascript 面试题随笔
2011/03/31 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
2013/01/23 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
2018/05/25 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
简单介绍django提供的加密算法
2019/12/18 Python
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
实习生个人的自我评价
2013/12/08 职场文书
铲车司机岗位职责
2014/03/15 职场文书
学生会主席演讲稿
2014/04/25 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
新闻报道稿范文
2015/07/23 职场文书
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js
MySQL如何使备份得数据保持一致
2022/05/02 MySQL
python解析照片拍摄时间进行图片整理
2022/07/23 Python