求个SQL,如何在符合条件的记录中每个group只取前两条?

jnyezhi 2008-12-08 01:49:43
有这么个表,里面有三个字段,分别是学生ID,班级ID和成绩,如下:

student_id class_id score

现在我想取出成绩最高的前10名学生ID,但每个班级最多取2名(假设第3、6、9名都是1班的,则不取真正的第9名,而是让第10名替补上来,以此类推)

请问这个SQL该怎么写,效率越高越好
...全文
333 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
whalefish2001 2008-12-11
  • 打赏
  • 举报
回复
呵呵,比较麻烦。
帮顶吧。
懒得去死 2008-12-08
  • 打赏
  • 举报
回复
http://blog.chinaunix.net/u/29134/showart_379356.html
willko 2008-12-08
  • 打赏
  • 举报
回复
程序过滤比较差的情况是遇到尖子班,把前N名都霸占了。。
willko 2008-12-08
  • 打赏
  • 举报
回复
恩~~
先拿前几条,然后在程序里过滤,,
不足10名,就拿多几条过滤。。。知道完成为止。
WWWWA 2008-12-08
  • 打赏
  • 举报
回复
关键楼主是要每个班级的前2名,用LIMIT似乎不行
willko 2008-12-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 WWWWA 的回复:]
没有看到记录及要求结果,TRY:
SELECT A.student_id,A.class_id,A.score
FROM TT A LEFT JOIN TT B
ON A.class_id=B.class_id AND A.SCORE <=B.SCORE
GROUP BY A.student_id,A.class_id,A.score
HAVING COUNT(B.class_id) <=2
[/Quote]
大哥的SQL果然强悍。。。。。

但是这个SQL。。要建立2个索引(student_id,class_id,score )和(class_id,score )可能有些不值得。。

其实小弟的简单看法是,select * from tt order by score limit 15
然后再程序里筛选,不够10条数据就再拿几条。。select * from tt order by score limit 15,5
WWWWA 2008-12-08
  • 打赏
  • 举报
回复
没有看到记录及要求结果,TRY:
SELECT A.student_id,A.class_id,A.score
FROM TT A LEFT JOIN TT B
ON A.class_id=B.class_id AND A.SCORE<=B.SCORE
GROUP BY A.student_id,A.class_id,A.score
HAVING COUNT(B.class_id)<=2
willko 2008-12-08
  • 打赏
  • 举报
回复
用程序实现吧。
估计~SQL写出来了性能也不怎样。。

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧