打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
查询分组后每个分组的前几条记录
userphoto

2014.04.23

关注
在MySQL使用中,经常需要查询每个分组的前几条记录(查询分组后每一个组的前几项),下面写了个简单的例子说明下SQL的写法。简单的表设计如下,要求每个班总分排名最前的前两条数据。

测试表语句如下:

1create table test(id int unsigned not null auto_increment primary key,name varchar(10),class varchar(20),score varchar(20));
2insert into test(name, class, score) values ('gonn', '6(1)', '299');
3insert into test(name, class, score) values ('yyun', '6(1)', '259');
4insert into test(name, class, score) values ('lin', '6(1)', '289');
5insert into test(name, class, score) values ('mei', '6(1)', '277');
6insert into test(name, class, score) values ('xj', '6(2)', '287');
7insert into test(name, class, score) values ('zhl', '6(2)', '277');
8insert into test(name, class, score) values ('lwjs', '6(2)', '257');
9insert into test(name, class, score) values ('lulu', '6(2)', '265');

运行以上SQL,得到的表结构如下:

01mysql> SELECT * FROM test;
02+----+------+-------+-------+
03| id | name | class | score |
04+----+------+-------+-------+
05|  1 | gonn | 6(1)  | 299   |
06|  2 | yyun | 6(1)  | 259   |
07|  3 | lin  | 6(1)  | 289   |
08|  4 | mei  | 6(1)  | 277   |
09|  5 | xj   | 6(2)  | 287   |
10|  6 | zhl  | 6(2)  | 277   |
11|  7 | lwjs | 6(2)  | 257   |
12|  8 | lulu | 6(2)  | 265   |
13+----+------+-------+-------+
148 rows in set

方法一

01mysql> SELECT a.id,a.name,a.class,a.score
02FROM test a LEFT JOIN test b on a.class = b.class and a.score < b.score
03GROUP BY a.id,a.name,a.class,a.score
04HAVING count(b.id) < 2
05ORDER BY a.class,a.score DESC;
06+----+------+-------+-------+
07| id | name | class | score |
08+----+------+-------+-------+
09|  1 | gonn | 6(1)  | 299   |
10|  3 | lin  | 6(1)  | 289   |
11|  5 | xj   | 6(2)  | 287   |
12|  6 | zhl  | 6(2)  | 277   |
13+----+------+-------+-------+
144 rows in set

方法二

01mysql> SELECT * FROM test a
02WHERE 2 >(SELECT count(*) FROM test WHERE class = a.class and score>a.score)
03ORDER BY a.class,a.score DESC;
04+----+------+-------+-------+
05| id | name | class | score |
06+----+------+-------+-------+
07|  1 | gonn | 6(1)  | 299   |
08|  3 | lin  | 6(1)  | 289   |
09|  5 | xj   | 6(2)  | 287   |
10|  6 | zhl  | 6(2)  | 277   |
11+----+------+-------+-------+
124 rows in set

这里列出了多种SQL语句的实现方法,有些是MySQL特有的(Limit, 其它数据库可根据实际更改,比如oracle的rownum,MS SQL SERVER 的 top,..),有时是SQL标准支持的。但效率上和应用的场合或许不同。具体应用时可根据实际表中的记录情况,索引情况进行选择。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
浅析SQL语句行列转换的两种方法 case...when与pivot函数的应用
在数据库中如何让列变成行,让行变成列的问题
spring对数据库操作的常用方法
sql 设置主键自动加1
超经典MySQL练习50题,做完这些你的SQL就过关了
ON DUPLICATE KEY UPDATE,唯一索引或者主键插入重复修改记录
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服