mysql使用GROUP BY分组实现取前N条记录的方法_Mysql

本文实例讲述了mysql使用GROUP BY分组实现取前N条记录的方法。分享给大家供大家参考,具体如下:

MySQL中GROUP BY分组取前N条记录实现

mysql分组,取记录

GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法。

这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~):

结果:

方法一:

复制代码 代码如下:

SELECT a.id,a.SName,a.ClsNo,a.Score FROM aa a LEFT JOIN aa b ON a.ClsNo=b.ClsNo AND a.Score<b.Score group by a.id,a.SName,a.ClsNo,a.Score having count(b.id)<2 ORDER BY a.ClsNo,a.Score desc;

拆开分析:

<!--[if !supportLists]-->1、 <!--[endif]-->LEFT JOIN aa b ON a.ClsNo=b.ClsNo AND a.Score<b.Score

同一个班级(每个班级四个人),分数比当前学生高的记录,那就意味这成绩垫底的学生,将会产生三条记录

<!--[if !supportLists]-->2、 <!--[endif]-->group by a.id,a.SName,a.ClsNo,a.Score having count(b.id)<2
a.id,a.SName,a.ClsNo,a.Score可以代表一个学生(以学生分组),如果count(b.id)<2(成绩超过你的人不能多于2个),那就只剩第一第二了。

方法二:

复制代码 代码如下:

SELECT * FROM aa a WHERE 2>(SELECT COUNT(*) FROM aa WHERE ClsNo=a.ClsNo and Score>a.Score) ORDER BY a.ClsNo,a.Score DESC;

这个我觉得是比较有意思的,取每一条记录,判断同一个班级,大于当前成绩的同学是不是小于2个人。

方法三:

复制代码 代码如下:

SELECT * FROM aa WHERE id IN (SELECT id FROM aa WHERE ClsNo=a.ClsNo ORDER BY Score DESC LIMIT 2) ORDER BY a.ClsNo,a.Score DESC;

这种方式进过测试不通过,ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' ,不能在这几个子查询中使用limit。

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》

希望本文所述对大家MySQL数据库计有所帮助。

时间: 2024-10-27 17:20:34

mysql使用GROUP BY分组实现取前N条记录的方法_Mysql的相关文章

获取MySQL的表中每个userid最后一条记录的方法_Mysql

如下表: CREATE TABLE `t1` ( `userid` int(11) DEFAULT NULL, `atime` datetime DEFAULT NULL, KEY `idx_userid` (`userid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8: CREATE TABLE `t1` ( `userid` int(11) DEFAULT NULL, `atime` datetime DEFAULT NULL, KEY `idx_userid

sqlserver分组取前n条记录

  1.前言. 这个有两种方法.1是用in,2是用row_number(),可根据情况来用.两种都可以. 2.举例. 方法1: Java代码 select a.* from table1 a where a.column1 in (select max(column1) from table1 group by a.column2,column3) 方法2: Java代码 with nyr as ( select NYR,QYZX_DM,FXSP_XH,SPBM_DLJ,WBSP_GG,JGLX

MySQL查询倒数第二条记录实现方法_Mysql

有时候会用到查询倒数第二条记录 复制代码 代码如下: last=HolderChangeHistory.find_by_sql (["               SELECT * FROM holder_change_histories                   where treasure_id = ?                   order by id desc                     limit   1,1  ",               

SQL Server查询前N条记录的常用方法小结_MsSql

本文实例讲述了SQL Server查询前N条记录的常用方法.分享给大家供大家参考.具体如下: SQL Server查询前N条记录是我们经常要用到的操作,下面对SQL Server查询前N条记录的方法作了详细的介绍,如果您感兴趣的话,不妨一看. SQL Server查询前N条记录: 因为id可能不是连续的,所以不能用取得10<id<20的记录的方法. 有三种方法可以实现: 一.搜索前20条记录,指定不包括前10条 语句: 复制代码 代码如下: select top 20 * from tbl w

mysql/Oracle/mssql取前几条数据sql写法

如在ms sqlserver 用此语句:  代码如下 复制代码 select top 2 * from test01 Oracle的语句:  代码如下 复制代码 select * from (select rownum r ,* from test) ttwhere tt.r > 50 and tt.r <= 100; (最好用PLSQL游标来解决) DB2中:  代码如下 复制代码 select * from payment fetch first 5 row only --查前5条记录 

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

比如有文章表 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.Inse

在SQL Server2005/2008中对记录进行分组,并获得每组前N条记录

本文为原创,如需转载,请注明作者和出处,谢谢!     假设有一个表,SQL语句如下: CREATE TABLE [dbo].[scan](     [km] [int] NULL,     [kh] [int] NULL,     [cj] [int] NULL ) ON [PRIMARY]     其中km为科目号.kh为考生号.cj为成绩,现对km和kh进行分组,并获得每组前2条记录(按cj从高到低排序).基本思想是为每组加一个序号列,再用where取序号小于等于2的.SQL语句如下: s

orderby-Oracle 排序后取前10条出错

问题描述 Oracle 排序后取前10条出错 (http://img.ask.csdn.net/upload/201509/25/1443167518_195061.jpg) Oracel中,我想在子查询中先分组,在排序,最后在外层做一个,取排序后结果的前10条结果 解决方案 他说你的语法错误,你检查下语法 解决方案二: 子查询需要命名,就是外层要 select * from (子查询语句)s where .... 解决方案三: order by 的问题,order by 后边不能用子查询的结果

sql 取前几行记录语句

SQLITE数据库:  代码如下 复制代码 select  * from table limit  N db2数据库:  代码如下 复制代码 select * from tab fetch first 10 rows only oracle数据库:  代码如下 复制代码 select * from tab where rownum <=10 sqlserver数据库:  代码如下 复制代码 select top 10 * from tab 1)如果表中有主键,可以用IN的方式.  代码如下 复制