有一个学校的奖学金表 school(classid,studentid,score) 返回每个班级成绩排名前20%的学生全部信息
如
(1,1,100),
(1,2,99),
(1,3,97),
(1,4,96),
(1,5,94)
(2,1,100),
(2,2,99),
(2,3,97),
(2,4,96),
(2,5,94)返回(1,1,100),(2,1,100)
不用存储过程,单独mysqlsql语句
如
(1,1,100),
(1,2,99),
(1,3,97),
(1,4,96),
(1,5,94)
(2,1,100),
(2,2,99),
(2,3,97),
(2,4,96),
(2,5,94)返回(1,1,100),(2,1,100)
不用存储过程,单独mysqlsql语句
from school s
where (select count(*)*0.2 from school where classid=s.classid)>(select count(*) from school where classid=s.classid and score>s.score)
classid, studentid为主键,classid, score上建索引
65536条记录,1600个班级,选出了12504条记录,耗时0.172sSELECT s.*
FROM school s,
(
SELECT classid,
count(*) * 0.2 AS maxPos,
group_concat(studentid ORDER BY score DESC) AS list
FROM school
GROUP BY classid
) x
WHERE s.classid = x.classid
AND FIND_IN_SET(studentid, list) <= maxPos
ORDER BY classid, score DESC;
find_in_set函数,查找studentid在逗号分隔的字符串中是否存在,存在的话,返回是第几个