日期:2014-05-20  浏览次数:20473 次

200分求一算法。很急,希望大家能帮我~


NewDig


NId UserID NContent AddTime
1 1 今天天气不错  
2 1 我很郁闷 
3 1 这个算法我不会
4 2 的身份
5 2 了刘嘉玲
6 2 地方 
7 2 的方式的 
8 3 斯蒂芬 
9 3 斯蒂芬
10 3 是地方地方
11 3 收费电视
12 4 的防守对方 
13 4 当时发生的
14 4 士大夫士大夫
15 4 斯蒂芬
......

以上是数据表结构

(虽然通过sql语句就能查出来,但是很耗数据库资源,现在求一算法)
求一算法 UserID 使用户ID 每个用户我只取两条数据 一共取4个用户 那么一共是8条数据

很急 很急 很急





------解决方案--------------------
study

------解决方案--------------------
坐等高手 学习
------解决方案--------------------
试一下这个,表名是tab_Test

select * from tab_Test a
where NId in (select top 2 NId from tab_Test where UserID= a.UserID ) and UserID in 
(select top 4 UserID from tab_Test group by UserID)
------解决方案--------------------
方法一:按降序取userID,转为数组,分割,从头扫描到尾,连续相同的元素只取前两条;如果不连续,取之.
方法二:按降序用reader读userID,一条一条的读出,连续相同的元素只读取前两条;如果不连续,读取之,直到读完。
------解决方案--------------------
我觉得从sql的算法来优化似乎不太可能,楼主应该寻找的是达到你最终目的 的方案。
因为你的sql语句再怎么牛x,你也得从这几百万条数据遍历一次,才能得到你要的数据吧?除非这个4个用户
的插入数据很规律,比如是4个用户按顺序每次一条的,那么你直接取最后8条就可以了。

我想到的理论上的解决方法(没有实验过):
1 把表NewDig分成四个子表,就是4个用户,每个用户独立一张表,因为nid和addtime都是增序的,默认是以nid为索引的,其实也就等于是以addtime为索引,写个存储过程,从每个表取最后两条数据然后合并,这样不用遍历整个表,速度应该会快很多。
2 增加一个表t,当表NewDig 有新数据插入的时候,同时也把数据插入t,但是与插入newdig不一样的是,
要把t里面的旧数据删除掉,使得每个用户在表t里都只有最新的两条数据。也就是说,t里面就只有楼主你所需的那8条数据。这样,取数据就只需select * from t 就ok了。
------解决方案--------------------
光从语法的角度很难提高效率了!

可以另建一个表RecentDig(NId,UserID),每天晚上用作业更新此表,从NewDig中将每用户最近的两条记录保存到RecentDig,那么每次取数时,只需取(select * from RecentDig)加上(select * from NewDig where Nid > RecentDig表的最大NID),当然前提是Nid字段要有索引;

以上只是一个思路,当业务数据越来越多,用中间表作临时存储数据可以大大提高效率,我管理的系统有200G数据,最大的表接近5亿行记录,并发量超过1千,仍能在win2000+sql2000+微机服务器下运行

------解决方案--------------------
就LZ这块地学习了
------解决方案--------------------
既然1、你不想从数据库取,2、你只要最新的2条数据,3、仅仅有四个用户
可以这样处理
1、在服务器文件夹下建个XML[code=XML][/code]<1><first record>今天天气不错</first record><second record>风和日丽的</second record></1><2><first record>我们下午没有课</first record><second record>我的大学生活</second record></2><3><first record>多么没有啊</first record><second record>哈哈</second record></3><4><first record>咯他</first record><second record>杀毒</second record></4>
2、每次添加新数据时写进相应的节点中
3、页面加载时读取相应节点信息
如果可以实现的话,速度会远远快于从数据库中读取数据。
如果你没有写数据的权限或其它原因不能实现该方案的话,建议使用索引、分区来优化数据库以便得到较好的性能~~