asp随机抽取数据库记录
在做"视频搜刮"时需要在随机取一条视频记录来初始化播放器的文件路径,原本打算是全部取出再用js的random随机取一个结点,但总觉得这样效率很低,于是便要考虑用asp随机取数据.
在数据库(access)中,我尝试了许多方法都实现随机取记录:
方法一:
数据库打开查询若干,省略... ...
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("<>("&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 & "<>"
RS.MoveNext
Loop
RS.Close
Set RS = Nothing
Con.Close
Set Con = Nothing
嘿,这样就行了!
评论