从各个分类中各取出前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
同样的引申到那个新闻表的问题也可以依此类推。我觉得这个解法比循环查询要好多了,不知道有没有更好的解决办法?