MySQL查询脚本分享_分类前十

有人在QQ群里提的一个问题:

一个成绩表scores 里存了小学六个年的学生成绩信息,有 id, grade, chinese, english, math 字段。 id 自动生成的整型,grade 为年级整型,123456, 其它为浮点数,如: 98.5, 现写一行 sql 语句查出每级总分前十名的记录

据说是某个公司的笔试题,平时不怎么写SQL,要用一条SQL实现,就捣鼓了一下,以下是方法。

方法一:
SELECT id,grade,summ,rank FROM (
SELECT h.id,
h.grade,h.summ,@rownum:=@rownum+1,
IF(@pdept=h.grade,@rank:=@rank+1,@rank:=1) AS rank,
@pdept:=h.grade
FROM (
SELECT id,grade,chinses+english+math AS summ FROM scores ORDER BY grade,summ DESC
) h ,(SELECT @rownum :=0 , @pdept := NULL ,@rank:=0) a ) result WHERE result.rank < 11;

PS:先对年级,总分进行降序排列,之后人为构造一个变量rank,使用if对每一行的记录按照分类grade加上排序序号,注意这里的a表,是对这几个变量赋初始值,之后进行判断rank<11,便得到了结果

这里主要使用变量值在SQL查询中并不常用,我也有参照网上的资料

方法二:
SELECT s1.*
FROM scores AS s1 WHERE (SELECT COUNT(1) FROM scores AS s2 WHERE s2.summ >= s1.summ AND s2.grade=s1.grade) <=10
ORDER BY grade,summ DESC;

PS:这条SQL逻辑性有点强,筛选条件这块要注意,满足两个条件一是年级相等,二是s2表的总分>=s1表的总分,计算满足这两个条件的记录数,把数目<=10的记录筛选出来,初学者可以这样思考,我们需要查s1表的记录,s2表的总分大于s1表的总分,如果只存在一条,那这个s1的记录便是最大的,同理。

个人建议使用第二种方法,逻辑性比较强,但是查询使用资源较少,肯定是比第一种方法快的

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注