关闭

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

标签: SQL分组前几名
641人阅读 评论(0) 收藏 举报
分类:
分组后查找每组的前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  
 
0
0
查看评论

MySQL 查询分页数据中分组后取每组的前N条记录

在使用数据库查询的时候,如果遇到对分页的数据分组,取每组的前N条,实际就是两次分页,先分页,在对分组的每组排序分页。SQL 如下select a.* from ( select t1.*,(select count(*)+1 from 表 where 分组字段=t1.分组字段 and 排序字段&l...
  • fun913510024
  • fun913510024
  • 2015-07-29 18:26
  • 3435

分组查询取每组前n条记录实例

假设有这样一张运动员比赛成绩表 tb_score 现在要求查询出每个国家的前三名的成绩记录,查询语句可以这样写: 1、 select t3.id,t3.country,t3.score from (select t1.*, (select count(*) from tb_score ...
  • zhutulang
  • zhutulang
  • 2015-09-23 15:17
  • 3489

sql server 分组,取每组的前几行数据

sql中group by或,获取每组中的前N行数据,目前我知道的有2种方法 比如有个成绩表: 里面有字段学生ID,科目,成绩。我现在想取每个科目的头三名。   1.   子查询 select * from score s where StudentName in ( selec...
  • u010032648
  • u010032648
  • 2016-05-20 22:01
  • 5807

[mysql] 先按某字段分组再取每组中前N条记录

From: http://blog.chinaunix.net/uid-26729093-id-4294287.html 请参考:http://bbs.csdn.net/topics/330021260 create table t2 (  ...
  • changgongzhao
  • changgongzhao
  • 2015-12-20 09:59
  • 1596

MySql中取出每个分组中的前N条记录

需求是这样的(CSDN上的一个问题):mysql中有个表:article(字段:id,type,date),type有1-10,10种类型。现在要用SQL找出每种类型中时间最新的前N个数据组成的集合。这个问题应该有很多方法可以实现,下面就来说说在网上看到的一位高手的实现(用一条SQL语句实现的,个人...
  • hudie1234567
  • hudie1234567
  • 2011-03-18 10:59
  • 12248

Mysql获取每组前N条记录

Select基础知识 我们在实现select语句的时候,通用的sql格式如下: select *columns* from *tables* where *predicate* group by *columns* having *predicate* orde...
  • zinss26914
  • zinss26914
  • 2016-10-21 17:53
  • 4622

mysql分组,取每组前几条记录

SELECT  * FROM 表名 a WHERE (SELECT count(*) FROM 表名 b WHERE b.日期=a.日期 AND b.id>a.id  )<5  ORDER BY 日期 asc,id desc 类似数据: 对上面数据按照日...
  • github_26672553
  • github_26672553
  • 2016-03-04 10:51
  • 7250

mysql分组 并显示前两条

select * from app_start_list s where 2>(select count(*) from app_start_list where title=s.title and id order by title
  • A9925
  • A9925
  • 2015-06-18 15:29
  • 462

mysql分组查询取前几条

最近对mysql分组查询取前几条这个问题做个总结 1:建表,搞点测试数据 CREATE TABLE IF NOT EXISTS test ( id tinyint unsigned NOT NULL AUTO_INCREMENT, type char(1) NOT NULL, ...
  • u011575570
  • u011575570
  • 2015-11-20 23:09
  • 4156

mysql分组取每组前几条记录(排序)

[sql] view plaincopy CREATE TABLE `mygoods` (     `goods_id` int(11) unsigned NOT ...
  • come_on_air
  • come_on_air
  • 2017-06-07 18:02
  • 2763
    个人资料
    • 访问:1424次
    • 积分:22
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:4篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档