今天去面试,碰到一道面试题:

有一个学生成绩表,表中有 表id、学生名、学科、分数、学生id 。查询每科学习最好的两名学生的信息:

建表sql:

CREATE TABLE `stuscore` (
`name` varchar(225) DEFAULT NULL,
`subject` varchar(225) DEFAULT NULL,
`score` int(10) DEFAULT NULL,
`stuid` int(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

插入数据:

INSERT  INTO `stuscore`(`id`,`name`,`subject`,`score`,`stuid`)
VALUES
(1,'张三','数学',20,1),
(2,'张三','语文',35,1),
(3,'张三','英语',50,1),
(4,'李四','数学',80,2),
(5,'李四','语文',60,2),
(6,'李四','英语',26,2),
(7,'王五','数学',68,3),
(8,'王五','英语',88,3),
(9,'王五','语文',84,3);

 表截图如下:

首先说一下需要查询的结果(每学科的前两名)如下:

*******************************************************************以上为需求,以下是思路和解决方案***********************************************************************

首先说一下思路,在这里思路里有沉淀的东西。

(本方法比后面方法要好,简单清晰)

某学科的前两人都有两个个特征:①学科为对应学科②该学科下,分数比其高或者等于的要小于两人

根据这个思路sql如下:

SELECT a.id,a.name,a.subject,a.score,a.stuid FROM stuscore a WHERE 2 >
(SELECT COUNT(*) countb FROM stuscore b WHERE b.subject=a.subject AND b.`score`>a.`score` ) GROUP BY a.stuid,a.subject

  

*备注:上面这个sql经测试可以正确查询

本人有两个问题

①将“>”两边的表达式调换位置,发现什么也没能查出来,不知道为什么

②在where 后面的括号里面的count括号里面的* 改成b.*,发现报错,而改成b.id 则可以正常查出来,不知道为什么

使用表的自连接,

SELECT a.name,a.subject,a.score,a.stuid ,b.name,b.subject,b.score,b.stuid
FROM stuscore a
LEFT JOIN stuscore b ON a.subject=b.subject AND a.score<b.score
GROUP BY a.name,a.subject,a.score,a.stuid
HAVING COUNT(a.stuid)<2 ORDER BY a.subject,a.score DESC;

 这个方法我看过来看过去觉得思路比较曲折,能力有限,不解释了

(如果只是想解决问题,可以不看本套解决方案,因为本解决方案经测试报错,无法正确查出记录,但是sql比较精妙)

SELECT * FROM stuscore a WHERE a.id IN
(SELECT b.id FROM stuscore b WHERE b.subject=a.subject ORDER BY b.score DESC LIMIT 2) ORDER BY a.subject,a.score DESC;

本人在想利用存储过程将这个问题解决,待续写。。。。

本文参考:http://www.jb51.net/article/87307.htm

  

mysql 分组查询前n条数据的更多相关文章

  1. mysql分组查询前n条数据

    建表: CREATE TABLE hard(id INT,aa varchar(50) ,bb INT,PRIMARY key(id))insert into hard values(1,'a',9) ...

  2. MySQL分组查询,前3条数据

    SELECT tpn.news_id, tpn.title, tpn.news_group_id, tpn.send_date FROM t_pm_news tpn WHERE 3 > ( SE ...

  3. mysql怎么查询前10条数据?

    mysql 没有top的用法.取而代之的是limit语法为:limit m,n省略n就可以得到你要的效果了. select * from table1 order by column desc  li ...

  4. 不同数据库,查询前n条数据的SQL语句

    不同的数据库,支持的SQL语法略有不同,以下是不同数据库查询前n条数据的SQl语句 SQL Server(MSSQL) SELECT TOP n * FROM table_name ORACLE SE ...

  5. MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)

    CREATE TABLE `t_test` ( `id` ) NOT NULL AUTO_INCREMENT, `stuid` ) NOT NULL, `score` ) DEFAULT NULL, ...

  6. mysql 数据库查询最后两条数据

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011925175/article/details/24186917  有一个mysql数据库的 ...

  7. Oracle查询前几条数据的方法

    在Oracle中实现select top N:由于Oracle不支持select top 语句,所以在Oracle中经常是用order by 跟rownum的组合来实现select top n的查询. ...

  8. mysql 查询前几条数据

    limit是mysql的语法select * from table limit m,n其中m是指记录开始的index,从0开始,表示第一条记录n是指从第m+1条开始,取n条.select * from ...

  9. MYSQL查询前30条数据

    , LIMIT 接受一个或两个数字参数. 参数必须是一个整数常量. 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量, 第二个参数指定返回记录行的最大数目. 初始记录行的偏移量是 (而不是 )

随机推荐

  1. WPF动画的几种模式

    最近在用WPF做简单动画,以下是几点经验总结: 1. 使用DispatcherTimer做动画 VB6的年代大家就用Timer做动画了,不用多解释,这个DispatcherTimer和本身的Timer ...

  2. ABAP WRITE

    1.空行 WRITE /. 2.AS CHECKBOX VALUE 'X', check2 VALUE ' '. START-OF-SELECTION. WRITE: / check1 AS CHEC ...

  3. Error和Exception的区别?

    Error和Exception都继承自Throwable类 二者不同之处在于: Exception: 1.可以是可控制的(checked)或是不可控制的(unchecked) 2.表示一个有程序员编写 ...

  4. JS实现正则表达式

    一.创建正则表达式 一共有两种方式: 1.直接量:var re = /[0-9]*/; 2.通过RegExp对象的构造函数:var re = RegExp("[0-9]*",&qu ...

  5. VS找到了XXX的副本,但是当前源代码与XXX中内置的版本不同

    1.博客园有解决ASP.Net出现以上问题的方法: 删除ASP.Net临时文件夹内的dll文件. https://www.cnblogs.com/autumn/p/5261576.html 2.但我的 ...

  6. javascript实现 滚动条滚动 加载内容

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 在Spark集群中,集群的节点个数、RDD分区个数、​cpu内核个数三者与并行度的关系

    梳理一下Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数.Executor数.core数目的关系. 输入可能以多个文件的形式存储在H ...

  8. pymysql 简单操作数据库

    #!/usr/bin/env python #-*- coding:utf-8 -*- # author:leo # datetime:2019/4/24 15:22 # software: PyCh ...

  9. PHP中可变变量到底有什么用?

    转自:http://blog.csdn.net/engine_1124/article/details/8660291 什么是可变变量? PHP提供了一种其他类型的变量——可变变量.可变变量允许我们动 ...

  10. css代码

    #footr { background: #3e434a } #header #blogTitle { background: url("http://images.cnblogs.com/ ...