随笔 - 113  文章 - 0  评论 - 218  阅读 - 73万

从各个分类中各取出前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

 

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

 

 

 

 

posted on   陈国利  阅读(424)  评论(2编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
< 2011年1月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示