a:关于提取随机记录_asp应用_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

a:关于提取随机记录

作者:黑客防线网安ASP维护基地 来源:黑客防线网安ASP维护基地 浏览次数:0

本篇关键词:记录随机提取关于
黑客防线网安网讯:原文作者myhhe.cn 静*脉(*是一个日文字符。)首先看看pjblog中随机记录插件的实现方法'Item_rs 在前面得到的需要取出的记录数 Random_sql="。。。" '(省略) Random_rs.open Random_s...

原文作者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~~~
在效率与科学性上都没得谈!  <注:人才!>
在这里特供各位朋友们在做随机取记录相关功能时参考使用!
欢迎各位对上面方法进行进一步的讨论!

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-14024-1.html
网站维护教程更新时间:2012-03-30 05:24:41  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer