最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

查询分组后每个分组的前几条记录

来源:动视网 责编:小采 时间:2020-11-09 13:36:38
文档

查询分组后每个分组的前几条记录

查询分组后每个分组的前几条记录:在MySQL使用中,经常需要查询每个分组的前几条记录(查询分组后每一个组的前几项),下面写了个简单的例子说明下SQL的写法。简单的表设计如下,要求每个班总分排名最前的前两条数据。 测试表语句如下: create table test(id int unsigned no
推荐度:
导读查询分组后每个分组的前几条记录:在MySQL使用中,经常需要查询每个分组的前几条记录(查询分组后每一个组的前几项),下面写了个简单的例子说明下SQL的写法。简单的表设计如下,要求每个班总分排名最前的前两条数据。 测试表语句如下: create table test(id int unsigned no

在MySQL使用中,经常需要查询每个分组的前几条记录(查询分组后每一个组的前几项),下面写了个简单的例子说明下SQL的写法。简单的表设计如下,要求每个班总分排名最前的前两条数据。 测试表语句如下: create table test(id int unsigned not null auto_inc

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

测试表语句如下:

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

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

mysql> SELECT * FROM test;
+----+------+-------+-------+
| id | name | class | score |
+----+------+-------+-------+
| 1 | gonn | 6(1) | 299 |
| 2 | yyun | 6(1) | 259 |
| 3 | lin | 6(1) | 289 |
| 4 | mei | 6(1) | 277 |
| 5 | xj | 6(2) | 287 |
| 6 | zhl | 6(2) | 277 |
| 7 | lwjs | 6(2) | 257 |
| 8 | lulu | 6(2) | 265 |
+----+------+-------+-------+
8 rows in set

方法一

mysql> SELECT a.id,a.name,a.class,a.score
FROM test a LEFT JOIN test b on a.class = b.class and a.score < b.score
GROUP BY a.id,a.name,a.class,a.score
HAVING count(b.id) < 2
ORDER BY a.class,a.score DESC;
+----+------+-------+-------+
| id | name | class | score |
+----+------+-------+-------+
| 1 | gonn | 6(1) | 299 |
| 3 | lin | 6(1) | 289 |
| 5 | xj | 6(2) | 287 |
| 6 | zhl | 6(2) | 277 |
+----+------+-------+-------+
4 rows in set

方法二

mysql> SELECT * FROM test a
WHERE 2 >(SELECT count(*) FROM test WHERE class = a.class and score>a.score)
ORDER BY a.class,a.score DESC;
+----+------+-------+-------+
| id | name | class | score |
+----+------+-------+-------+
| 1 | gonn | 6(1) | 299 |
| 3 | lin | 6(1) | 289 |
| 5 | xj | 6(2) | 287 |
| 6 | zhl | 6(2) | 277 |
+----+------+-------+-------+
4 rows in set

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

文档

查询分组后每个分组的前几条记录

查询分组后每个分组的前几条记录:在MySQL使用中,经常需要查询每个分组的前几条记录(查询分组后每一个组的前几项),下面写了个简单的例子说明下SQL的写法。简单的表设计如下,要求每个班总分排名最前的前两条数据。 测试表语句如下: create table test(id int unsigned no
推荐度:
标签: 查询 记录 分组
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top