页面

2009年3月7日

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 

嘿,这样就行了! 

没有评论: