IT学习者 | 文章大全 | 技术文档 | 桌面壁纸 | 实用查询 | 网络电台 | 成语 | 歇后语 | 网址 | 下载 | 周公解梦 | 生日密码 | 电视剧365 | Flash
 您现在的位置: IT学习者 >> 文章大全 >> 网络编程 >> ASP技术

asp:关于提取随机记录

【 来源:网络  更新时间:2008-8-22 | 字体:

原文作者myhhe.cn 静*脉(*是一个日文字符。)

首先看看pjblog中随机记录插件的实现方法

'Item_rs 在前面得到的需要取出的记录数
Random_sql="。。。" '(省略)
Random_rs.open Random_sql,conn,1,1
'=========================================
Count_rs=Random_rs.RecordCount'----记录总数
Item_rs=LoadModSet.getKeyValue("RandomPage")'---------随机显示记录
array_rs = Random_rs.getrows(Count_rs)'-------将记录集放入数组array_rs中
Randomize'---------初始化随机数生成器。
for Random_i = 0 to Item_rs'----循环显示Item_rs条记录
'******************************************************************
'下面这个for是用来如果随机数j有重復就重新生成随机数j,没重復会退出这个for循环
'下面的ubound(array_rs,2) 是数组最大下标,相当记录总数
for Random_m=0 to ubound(array_rs,2)
Random_j=int(rnd*Count_rs)'------在记录总数范围内生成随机数j
array_str = split(str,",")'----str字符串用来记录以前生成的随机数j,这里将str折成数组用来和新的j比较
'====================================================
'下面这个for是用来检测新生成的随机数j和以前生成的随机数对比,
'如果有相同就退出这个for回头重新生成随机数j
for Random_n = 0 to uBound(array_str)
if cstr(Random_j)=cstr(array_str(Random_n)) then
new_j=false'----如果比较后这个新j与前面的有相同,将new_j设為false并退出for
exit for
else
new_j=true'---如果没相同的我们设new_j為true
end if
next
'====================================================
if new_j=true then exit for'----new_j為true说明这个j没有相同的,不须重新生成随机数j,我们退出for
Next
'******************************************************************
str=str&Random_j&"," '----str是记录前面生成的随机数j并用,号隔开方便折成数组
'。。。。。
'省略部分
Next


可以看到,虽说只用了一句sql,但执行效率较低(在数据数量超过一定值时)
他的方法也是目前网上最常用到的方法,得到记录范围,在范围中生成随机数,应需要的记录条数,取出无重复的记录,用到了3个嵌套的循环,第一层,循环 Item_rs
次,第二层理论上在每次的上级循环中,只循环一次,不过最多不会超过10次的,第三层只是一个判断,在每次的上级循环中,会按第一次循环数递增。
按道理上说,一般在一个只有三五百至上千数据中取个十条八条是没什么影响的,但是如果取出20-100条做动态滚动或切换展示,或记录总数超过一万以上,哪就可想而知了,不过这一次我都没有去测试!
<注:不知道查询怎么写的 可能提取了所有记录 速度可能会比较慢>
否定了上面的思路后,我继续寻找我的答案~。。。又看到了一个方法:

yourstr="*1*3*4*6*12*...."
sql="select top 10 * form yourdb where instr('*'&id&'*','"&yourstr&"')<>0

不可取,因为随机ID的范围不知道,yourstr中,随机生成一组ID,如10个,很有可能只有部分在当前数据记录的范围中,也就是很难满足设计者的需求取出指定条数!不过思路比较不错!
<这个是不错的办法,应该也比较容易指定条数>


继续,还有一方法:

n=10 ''取任意10条记录
set rs = server.CreateObject ("adodb.recordset")
sql = "select * from table"
rs.open sql,conn,1,1
count=rs.recordcount ''记录总数
IF Count<>empty Then
Randomize
for i = 1 to n ''循环n次
num=Fix(Rnd*count) ''num便是随机产生的记录行数,用Fix(),使其不会大于count值。
rs.move num ''移到改随机行
Response.write rs(0) ''出该条记录
rs.movefirst ''别忘了再把指针移到第一条
next
End IF
rs.close
set rs = nothing


上面这种方法,在技术含量上还比较高,用到了指针,呵呵,不过也是不太科学,应该要取出所有记录,并没有达我所想的要求!

<注:移动游标 可能这个是最慢的>

继续找百度啊,呵呵,搜索网站确实有他的好处,就是逢难不求人啊!

又找到一方法:

SQL Server 2000:
Select TOP n * FROM [tablename] orDER BY NEWID()

Access:
Select TOP n * FROM [tablename] orDER BY rnd(id)


上面这种方法,极其科学,效率不错,我马上就选择了他。
可是在测试中却发现,当以上语句随机输出10条后,无论怎么刷新页面,他显示的好像都是那10条~!天啊~! 【!!】


唉...突然,一道奇光闪过眼前~
新的方法又有了:

Randomize
Sql="Select top 10 * FROM [table] order by rnd(-(id +" & rnd() & "))"
Set Rs=Conn.Execute(Sql)

上面的代码经测试,SO GOOD~~~
在效率与科学性上都没得谈!  <注:人才!>
在这里特供各位朋友们在做随机取记录相关功能时参考使用!
欢迎各位对上面方法进行进一步的讨论!

相 关 文 章
相 关 软 件

音乐
嫁衣 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 没有人比我更爱你
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 明天过后 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 降临 下雨天 小酒窝 樱花草 恋爱新手 说唱脸谱 红色高跟鞋 寂寞才说爱 深深爱过你 爱上你是个错 即使知道要见面 不是因为寂寞才想你
城府 假如 花海 兰亭序 棉花糖 舍不得 最后一次 女人如烟 外滩十八号 我们的纪念 我们的无奈 心在跳情在烧 爱上你是我的错 爱情里没有谁对谁错
加入收藏留言建议自助友情链接普通友情链接站长的Blog
版权所有   COPYRIGHT 2002-2008 ★IT学习者★ ALL RIGHTS RESERVED.