您的位置:首页 > 数据库 > MySQL

[MySQL]分组后查找每组的前N条记录语句

2016-06-01 22:44 363 查看
分组后查找每组的前N条记录语句    作者:张守磊 

Java代码  

考你一条sql语句  

如有表 student   

id  name age  class   

1   张1   15     1  

2   张2   15     1  

3   张3   15     1  

4   张4  15     2  

5   张5   15     2  

6   张6   15     2  

7   张7   15     3  

8   张8   15     3  

9   张9   15     3  

10   张10   15     5  

11   张11   15     5  

 

现在想得到每个班级的前2名学生资料  

 

根据题意是,按class分组,然后取id靠前的两名,相信大多数人都能想到基本组合: 

  www.2cto.com  

SELECT a.* 

 

FROM student a 

 

ORDER BY a.class, a.id; 

 

另加:Limit 0,2来配合。 

 

(注:MYSQL 中没有top n的写法,取代的是LIMIT。) 

 

Limit 0,n只能取到最前的n位,但如何能取到每个班的前两位呢,就无从下手了。 

 

下面我来具体分析一下这题的解法: 

 

1、获取每个class的前两位: 

 

SELECT a.* 

 

FROM student a 

 

WHERE 

 



  www.2cto.com  

  SELECT COUNT(*) 

 

  FROM student 

 

  WHERE class = a.class 

 

  AND id < a.id 

 

) < 2 

 

#遍历所有记录,然后取该条记录与同班中的所有记录比较,只有当班上不超过两个人(含两个人)比该记录id小的话,该记录才被认定为该记录id排名前2,然后显示出来。 

 

2、当获取所有合格的数据有,按class与id排序: 

 

在最后添加: 

  www.2cto.com  

ORDER BY a.class, a.id; 

 

最终结果: 

 

SELECT a. * 

FROM student a 

WHERE ( 

 

SELECT COUNT( * ) 

FROM student 

WHERE class = a.class 

AND id < a.id 

) <2 

ORDER BY a.class, a.id 

LIMIT 0 , 30; 

 

遍历所有记录,然后取该条记录与actionid中的所有记录比较,只有id不超过1个比该记录id小的话,该记录才被认定为该记录id为最大id,然后显示出来。 

  www.2cto.com  

Java代码  

 SELECT a.*  

FROM messagesend a  

WHERE (  

SELECT COUNT( * )  

FROM messagesend t  

WHERE t.actionid = a.actionid  

AND id < a.id  

) <1  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: