首页.日志标签.留言本.友情链接.网站地图.管理登录
用asp随机从数据库中读取不重复的记录
发表于:2007-9-17 19:31:07 |分类:网络·资源·百宝箱 |浏览() |评论() |引用() |天气:
  • 今天做网站需要用到一个随机生成条目的功能,就是随机从数据库中读取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 

    嘿,这样就行了!
引用通告地址:Http://www.jswy.org/ASTBRec.Asp?LogID=117
Tags:asp
上一篇:重看泰坦尼克(Titanic)|下一篇:关于最近我和老婆的几个梦
正在读取评论数据...
发表评论
您的昵称: [匿名]
评论内容:
 
BLOG 专题
  • 暂时没有专题
BLOG 分类
推荐日志
热门日志
日志搜索

正在载入Tags...