从各个分类中各取出前N个记录

经常会遇到这样的需求,一张详细新闻表,一张新闻类别表,详细新闻表引用了新闻类别的类别编号,同时存主外键关系,现在需要查询每一个类别的前10条记录,并显示于前台页面上。

我见到过有人用循环读取每一个分类别的方法,然后再用每一个分类编号去查询对应的前10条记录,最后合并成一个DataTable对象,最后把数据源绑定到前台。这样做法也能达到显示效果,但是效率怎么样呢?我敢肯定地说,如果数据量不多,或许勉强应付得过去,如果数据量多的话,不行。

那么有什么办法可以解决这个问题呢?

先看一个例子

如一班级成绩表

现建立课程表 tableA

sid         sname
1             语文
2             数学
3             英语

建学生成绩库 tableB

id         sid           fen           name
1          1             100           张三
2          1              89            李四
3          1              95            王五
4          2             89             张三
5          3             78             王五
6          2             99             王五

可以显示出所有科目前10名单

select a.sid,sname,id,fen,name from tableA a inner join
   (select * from tableB b
       where id in(select top 10 id from tableB where sid=b.sid
       order by fen desc)) as b
       on a.sid=b.sid
       order by a.sid,fen desc

SELECT sid, sname, fen,name FROM (SELECT px =(SELECT COUNT(1) + 1  FROM tableB  WHERE sid = b.sid AND fen > b.fen), a.sid, a.sname, b.fen,b.name FROM tableA a JOIN tableB b ON a.sid = b.sid) t WHERE (px <= 10) ORDER BY sid, fen DESC

同样的引申到那个新闻表的问题也可以依此类推。我觉得这个解法比循环查询要好多了,不知道有没有更好的解决办法?

原文地址:https://www.cnblogs.com/cgli/p/1945267.html