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抛出异常的几种常见解决方式
May 18 MySQL
MySQL数据库压缩版本安装与配置详细教程
May 21 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MySQL 5.7常见数据类型
Jul 15 MySQL
MySQL如何解决幻读问题
Aug 07 MySQL
mysql主从复制的实现步骤
Oct 24 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
MySQL 执行数据库更新update操作的时候数据库卡死了
May 02 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 MySQL
MySQL导致索引失效的几种情况
Jun 25 MySQL
教你解决往mysql数据库中存入汉字报错的方法
MySQL时间设置注意事项的深入总结
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 #MySQL
MySQL创建高性能索引的全步骤
将图片保存到mysql数据库并展示在前端页面的实现代码
MySQL的join buffer原理
Apr 29 #MySQL
Mysql服务添加 iptables防火墙策略的方案
Apr 29 #MySQL
You might like
PHP中for与foreach的区别分析
2011/03/09 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
jQuery的deferred对象使用详解
2011/08/20 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
总结javascript三元运算符知识点
2018/09/28 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
Python3如何解决字符编码问题详解
2017/04/23 Python
python paramiko模块学习分享
2017/08/23 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
django跳转页面传参的实现
2020/09/17 Python
JavaScript+Canvas实现自定义画板的示例代码
2019/05/13 HTML / CSS
介绍一下Make? 为什么使用make
2016/07/31 面试题
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
管理专员自荐信
2014/01/26 职场文书
音乐专业自荐信
2014/02/07 职场文书
企业标语口号
2014/06/10 职场文书
高中生学习计划书
2014/09/15 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
如何写好竞聘报告
2019/04/03 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android
Java实现简单小画板
2022/06/10 Java/Android