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

  今天早上在给郑州家政网添加新闻资讯的时候发现写的那个详解科讯CMS(KesionCMS) 的相关文章中的相关文章这块,当文章标签相同并且很多的时候,不知道为什么出来的文章没有变化,也没仔细看,老感觉总是那么几篇;既然这样干脆加个随机显示(原来使用的是by ID DESC)

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

原来写过一个但是现在时间长了也忘了,在网上找了一下随机生成条目的功能,就是随机从数据库中读取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

嘿,这样就行了!

以下是我从网上找到的一个已经写好的asp随机读取数据库源码程序提供下载测试使用

点我下载

参与评论