Jul4在ACCESS+ASP环境下实现随机排序的简单解决方案
在做Z-Blog的新样式时想随机取N个Tags放到右侧的,但实际操作时却遇到了问题--就是在Access中如何对记录进行随机排序的问题。
在SQL Server中想进行随机排序(随机取N条记录)只需要简单地加个“Order By Rnd()"或”Order By NewID()"就搞定了,但这招到了ACCESS中却不好用了。在ACCESS中用以上Order排出来的结果每次都是一样的。在网上搜了一下,也没有找到比较有建设性的解决方案,大多数都是建议用SQL语句查询出全部记录,然后在ASP中进行随机排序。
在ASP中排序我是不喜欢的,因为这样一来就得对Z-Blog的源码进行大改,而不是只改一个查询语句了。装上ACCESS试了N久,发现用“Select * From [Blog_Tag] Order By Rnd(Tag_ID)"可以实现对记录集的随机排序(其中Tag_ID是[Blog_Tag]这个表的主键『下同』--不必非是主键,只要是数字类型的字段就可以了)。但奇怪的是在ACCESS中明明可以随机排序的,在ASP中用同样的语句进行查询却还是每次查询出的记录集顺序相同。
再试…… 最后终于发现用“SELECT * FROM [blog_Tag] ORDER BY Rnd(tag_id-timer())”在ASP跟ACCESS中查询得到的记录集是随机排序的了。但奇怪的是用Rnd(tag_id+timer())或Rnd(timer()-tag_id)做条件竟然都不行,怪!!
====================
这么一来在Z-Blog中实现随机取前N条记录放到侧边栏就简单了:
- 把\Function\c_system_event.asp中第1200行左右的Set objRS=objConn.Execute("SELECT * FROM [blog_Tag] ORDER BY [tag_Order] DESC,[tag_Count] DESC,[tag_ID] ASC") [在BlogReBuild_Tags这个函数中]替换为SELECT Top 50 * FROM [blog_Tag] ORDER BY rnd(tag_id-timer()) [其中50为要随机选择的关键词个数,自己想要多少个随便改]
- 在模板的侧边栏中把Tags云集缓存文件引用进去:在适当位置加入<#CACHE_INCLUDE_TAGS#>
以上两步就可以了。如果想效果再好一点的话请再接着改:
- 还是在\Function\c_system_event.asp的ReBuild_Tags函数中,也是1200行左右,把strTag=strTag & "<li><a href="""& Tags(objRS("tag_ID")).Url & """>"+Tags(objRS("tag_ID")).Name + " (" & Tags(objRS("tag_ID")).Count & ")" +"</a></li>"替换为strTag=strTag & "<a style='font-family:verdana,sans-serif;line-height:150%;font-size:"& 12 + (Tags(objRS("tag_ID")).Count/2) &"px;margin:10px;' title='" & Tags(objRS("tag_ID")).Count & "' alt='"& Tags(objRS("tag_ID")).Count &"' href='" & Tags(objRS("tag_ID")).Url &"'>" & Tags(objRS("tag_ID")).Name & "</a>"
- 再搭配Z-Blog多彩Tags插件使用效果更佳。
PS: 明天去武汉,可能又一个周不能写Blog了。