用asp随机从数据库中读取不重复的记录

想从数据库中随机出来数据来,由于对vbscript不是很懂,比如现在还搞不清怎样用vbscript在数组中删除和插入值,首现是我想用javascript中的随机函数Math.random()得到一些数值并把所有数据保存在数组中,再用sql语句取记录,后来在页面中又是用vbscript,又是用javascript,有一个问题是vbscript不能访问js中的变量.没办法,查了一下用vb写随机函数.

<%
Function MyRnd(NumMin,NumMax) 
Randomize 
MyRnd 
= Int(Rnd * (NumMax - NumMin + 1)) + NumMin 
End Function 
%
>

但还是不知道怎样用sql语句来取值,在网上找了一下,终于找到好方法,下面内容来源:

http://hi.baidu.com/xytblog/blog/item/0632b525011e896435a80f65.html

今天做网站需要用到一个随机生成条目的功能,就是随机从数据库中读取n条不重复的信息,随机显示出来,网上搜了一下大体有以下三种方法,总结如下,个人觉得最后一种方法最好用最简单.

方法一:

数据库打开查询若干,省略... ...
Set rs = Server.CreateObject("Adodb.RecordSet")
rs.open sql,conn,1,1

DIM Appeared
Call DisRndRecord(10,rs.recordCount)'调用函数该位置显示记录

'################SUBS################
'#DisRndRecord(DisNum,rsBound)
'#参数DisNum:显示数量
'#参数rsBound:随机数产生范围
Sub DisRndRecord(DisNum,rsBound)
DIM i,ThisRnd
If rsBound < DisNum Then DisNum = rsBound'记录总数小于要抽取记录条数的情况
For i = 0 To DisNum - 1
ThisRnd = GetRnd(rsBound)'取得一个不重复的随机数
rs.Move(ThisRnd)'游标移动到随机数位置数读取
Response.Write("<br>("&rs("id")&")"&rs("Title"))
rs.Move(-ThisRnd)
Next
End Sub
'# 函数GetRnd(bound)返回一个不重复的随机数字
'#参数bound:随机范围
Function GetRnd(bound)
DIM ranNum
Randomize()
ranNum=int(bound*rnd)
If Instr(Appeared,"["&ranNum&"]") Then'产生的随机数是否出现过
ranNum = getRnd(bound)
End If
Appeared = Appeared & "["&ranNum&"]"'记录已出现的随机数
GetRnd = ranNum
End Function

方法二:

另外一个更有用的函数:NewID(),它返回一个GUID(全局唯一标志符)。
Rand()函数用在SQL语句中没有作用。可能只能用在SQL SERVER中。

//随机返回10条记录
select top 10

newid() as row, productid, productname

from Products

order by row

相关参考:
NEWID()另外一个应用是在Select出记录时随即选出N条记录
比如:Select top 5 * from yourtable order by newid()这样就能从yourtable表中每次随机地选出5条记录,这对于随机显示新闻的地方比较有用

-----------

随机提取10条记录的例子:
Sql server:

select top 10 * from 表 order by newid()

Access:

Select top 10 * FROM 表 orDER BY Rnd(id)

Rnd(id) 其中的id是自动编号字段,可以利用其他任何数值来完成

比如用姓名字段(UserName)

Select top 10 * FROM 表 orDER BY Rnd(len(UserName))

MySql:

Select * From 表 order By rand() Limit 10

表 TestTable,有自动编号字段 TestID,标题字段 TestTitle,随机取得5条纪录,用代码:
Randomize
Select TOP 5 [TestTitle] FROM [TestTable] orDER BY Rnd(-(TestID+"&Rnd()&"))

方法三:

asp从access数据库中随机抽取记录
                                       

'随机抽取选择题
Set rs= Server.CreateObject("ADODB.Recordset")    
rs.open "Select id from [shiti] where type=1 order by Rnd(id)",conn,1,1
Count=rs.RecordCount   
redim a(xzcount),t(Count)
for each j in t
j=0
next
' 随机抽取记录号
Randomize timer   '初始化随机数生成器
for j=1 to xzcount
     k=int(rnd*Count+1) '从总数里面随机取一条记录
     do while t(k)<>0                  '判断是否记录是否已经在数组中
       k=int(rnd*xzcount+1)
     loop
     t(k)=1    '第k条记录被选中
next
j=1:i=1'定义下标
' 循环选取数据集rs中的部分记录存放到数组中
do while not rs.Eof
    if t(j)=1 then
     a(i)=rs("id")            '记录id
     i=i+1
   end if
   j=j+1
   rs.MoveNext
   Loop
   rs.close
  
   for i=1 to xzcount
   rs.open "select * from [shiti] where id="&a(i)&"",conn,1,1

rnd(id)可以改变记录的顺序

但是在asp中运行查出来的一条数据总是不会改变!!怪啊,数据库中却是没问题的,后来尝试最后一种方法:

方法四(超级简单!):


Set Con= Server.CreateObject("ADODB.CONNECTION")
ConnString = "Provider=MicroSoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("myconnnnb.mdb")  
   Con.Open ConnString
   Randomize
   Set RS = Con.Execute("Select TOP 3 id FROM czfxx orDER BY rnd(-(id +" & rnd() & "))")
   Do While Not RS.EOF
    Response.Write RS.Fields("id").value & "<br />"
    RS.MoveNext
   Loop
   RS.Close
   Set RS = Nothing
   Con.Close
   Set Con = Nothing

嘿,这样就行了!

下面是一个测试文件,请打开random2.asp进行测试:

点击下载

posted @ 2009-03-26 12:14  爱恋永恒  阅读(1368)  评论(0)    收藏  举报