主题:  我的论坛不知道该怎么排序,痛苦……希望大家点拨。

Such a lovely place

职务:普通成员
等级:2
金币:10.0
发贴:573
注册:2001/11/4 21:15:56
#12002/10/25 21:13:47
我的论坛2个表,主题表,回复表,topicid关联。现在的问题是在论坛首页怎么给记录排序呢?如果按topicid倒序,那么下面的主题如果有回复,该主题将不会升至为第一条记录。如果按最后回复时间倒序,那么,如果哪篇主题有回复,会升至第一位,但新发表的文章因为没有回复而排至最后面去了……:(

请问怎么样才能做到:如果发表新文章,则排在第一;如果某主题有最新回复,该主题也排在第一呢?



Such a lovely place

职务:普通成员
等级:2
金币:10.0
发贴:573
注册:2001/11/4 21:15:56
#22002/10/25 22:11:34
我查了一下论坛,在一篇文章里看到如下解释(因为不太看懂,我自己理解,不知道对不对):主题按时间倒序,但关键是如果该主题有回复,那么主题发布时间就改为最新回复时间。但如果我还想利用该主题原始发布时间怎么办呢?(抓耳挠腮中)



5D荣誉斑竹

职务:普通成员
等级:2
金币:10.0
发贴:710
注册:2001/10/24 18:34:42
#32002/10/25 22:38:45
你的方法基本是可以的,也就是有主题表有2个时间的字段,一个是发表日期,一个是更新日期,排序还是根据最新更新日期的来。

当发表新主题时,发表日期和更新日期相等(可以设置为默认的Now()),而有回复时,给主题表做一个command的更新,使主题表的更新日期字段等于回复的发表日期(也可以用Now())

Update 主题表 set 更新日期='"&Now()&"' where 主题ID="&ID&"



Such a lovely place

职务:普通成员
等级:2
金币:10.0
发贴:573
注册:2001/11/4 21:15:56
#42002/10/25 23:11:24
呵呵,谢谢小田。我立马动手修改我的表。:)



Such a lovely place

职务:普通成员
等级:2
金币:10.0
发贴:573
注册:2001/11/4 21:15:56
#52002/10/26 0:10:59
按此法搞定。谢:)
发现一个小问题:
Update 主题表 set 更新日期='"&Now()&"'

Update 主题表 set 更新日期= Now()
得到的结果是不一样的。用上面的更新日期,回复时间和更新时间完全一致,用下面的方法,更新时间比回复时间慢一秒。



5D荣誉斑竹

职务:普通成员
等级:2
金币:10.0
发贴:710
注册:2001/10/24 18:34:42
#62002/10/26 9:19:50
时间日期型的其实是字符型的,所有上面的比较好一些,因为用:set 更新日期='"&Now()&"',用的是页面程序里取出的时间,而用:set 更新日期= Now(),是数据库里的时间。当然要慢一拍了:)



Such a lovely place

职务:普通成员
等级:2
金币:10.0
发贴:573
注册:2001/11/4 21:15:56
#72002/10/26 10:38:50
呵呵,原来如此,我说怎么慢一拍呢。:)




闪亮源码

职务:普通成员
等级:1
金币:0.0
发贴:29
注册:2001/5/22 12:09:57
#82002/10/28 13:02:16
当发表新主题时,发表日期和更新日期相等(可以设置为默认的Now())
这里所指的字段是否是主题表里面的两个字段??
如何使这两个字段在数据库里面的值相等???

是否两个字段都是设置为now() ??

我有两个表,一个是topic表,一个是reply表
topic表有两个字段:postdate(这个是主题发表的时间,默认值是now())
另一个是lastreplydate(这个是用来显示最后回复的时间,通过update命令来更新的字段)
我按照上面的方法把lastreplydate字段的默认值设置我now(),

在回复的页面添加update命令

(参考上面的: Update 主题表 set 更新日期='"&Now()&"' where 主题ID="&ID&")

Update topic
set lastreplydate='"&Now()&"'
where ID="&ID&"

我这样做了
但是回复后没有更新lastreplydate的字段值!!



Such a lovely place

职务:普通成员
等级:2
金币:10.0
发贴:573
注册:2001/11/4 21:15:56
#92002/10/28 13:24:08
“发表日期”和“更新日期”都为主题里的字段,只要都设为now()即可相等。这个方法是可以的,我已成功。你没有成功我想是细节问题,我说说我是怎么做的:
我在回复后转向一个处理页面,然后在处理页面作一个command,执行完command后,response.redirect("url")。代码如下:
<%@LANGUAGE="VBSCRIPT"%>

<%

if(request.querystring("topicid") <> "") then Command1__a = request.querystring("topicid")

%>
<%

set Command1 = Server.CreateObject("ADODB.Command")
Command1.ActiveConnection = MM_luntan_STRING
Command1.CommandText = "UPDATE topic SET gengxintime = '"&Now()&"' WHERE topicid = " + Replace(Command1__a, "'", "''") + ""
Command1.CommandType = 1
Command1.CommandTimeout = 0
Command1.Prepared = true
Command1.Execute()

%>
<% response.redirect("view.asp?topicid=" + Replace(Command1__a, "'", "''") + "") %>



Such a lovely place

职务:普通成员
等级:2
金币:10.0
发贴:573
注册:2001/11/4 21:15:56
#102002/10/28 13:29:50
补充:genxintime为我的更新字段;在command里设置一个变量a,值为
request.querystring("topicid"),view.asp是我的“查看回复页面”;当你想用变量a的时候,比如传递参数或where条件中,要写成:
" + Replace(Command1__a, "'", "''") + "
我就是这么搞定的。



5D荣誉斑竹

职务:普通成员
等级:2
金币:10.0
发贴:710
注册:2001/10/24 18:34:42
#112002/10/28 13:43:35
闪亮源码在上个帖子中说
引用:
当发表新主题时,发表日期和更新日期相等(可以设置为默认的Now())
这里所指的字段是否是主题表里面的两个字段??
如何使这两个字段在数据库里面的值相等???

是否两个字段都是设置为now() ??

我有两个表,一个是topic表,一个是reply表
topic表有两个字段:postdate(这个是主题发表的时间,默认值是now())
另一个是lastreplydate(这个是用来显示最后回复的时间,通过update命令来更新的字段)
我按照上面的方法把lastreplydate字段的默认值设置我now(),

在回复的页面添加update命令

(参考上面的: Update 主题表 set 更新日期='"&Now()&"' where 主题ID="&ID&")

Update topic
set lastreplydate='"&Now()&"'
where ID="&ID&"

我这样做了
但是回复后没有更新lastreplydate的字段值!! :confused:


发表日期和更新日期都设置成Now()是这样用的,更新日期是用来做排序的(有最新的回复就把主题放到列表的前面),而发表日期是纯粹用来显示的(比如发表于2002-10-12)或是搜索时使用的。

如果command 没有效果,你检查一下是不是传递的参数有问题



闪亮源码

职务:普通成员
等级:1
金币:0.0
发贴:29
注册:2001/5/22 12:09:57
#122002/10/28 13:45:26
谢谢你。。
时间排序的问题解决了啦。。


接下来解决最后回复人的问题
相信道理应该是一样的吧。。



闪亮源码

职务:普通成员
等级:1
金币:0.0
发贴:29
注册:2001/5/22 12:09:57
#132002/10/28 13:52:30
糟糕!!
最后回复人lastreplyUser字段这个在主题表里面如何设置默认值呢?



5D荣誉斑竹

职务:普通成员
等级:2
金币:10.0
发贴:710
注册:2001/10/24 18:34:42
#142002/10/28 16:50:22
最后回复人可以有2个方法,一个直接取出回复表中的作者,不过就得用到嵌套了,如:
<%
'连接数据库,建立记录集(rsTopic--主题表,rsReply--回复表)
set conn=Server.CreateObject("ADODB.connection")
conn.Open MM_conn_STRING      '连接字符串
set rsTopic=Server.CreateObject("ADODB.recordset")
rsTopic.Open "select * from 主题表 order by 更新日期",conn,1,1
set rsReply=Server.CreateObject("ADODB.recordset")
rsReply.Open "select TOP 1 * from 回复表 order by 回复日期",conn,1,1
'记录循环
While NOT(rsTopic.eof)
  FilterParam=rsTopic("ID")
  rsReply.Filter="主题ID="&FilterParam
  Response.Write "主题:"&rsTopic("主题标题")&"  最后回复:"&rsReply("作者")&"
" rsTopic.MoveNext Wend %>


第2个方法,在主题表中设置一个字段比如你上面写的lastreplyUser,设置默认值("---------------"),在回复主题时,修改原来的command,如:

Update 主题表 set 更新日期='"&Now()&"',lastreplyUser='"&Session("MM_Username")&"' where 主题ID="&ID&"

当然还有别的方法,不过常规的就是这2种了



闪亮源码

职务:普通成员
等级:1
金币:0.0
发贴:29
注册:2001/5/22 12:09:57
#152002/10/28 20:02:48
我的reply表的用户名字段是user,我要update的字段分别有topic表的count(记录页面打开的次数的字段)字段,replycount(回复帖子数)字段,lastReplyDate (最后回复日期字段),lastReplyUser (最后回复用户字段);

现在
count = count+1(更新阅览次数)
replycount= rsreply_total (reply表的total字段更新topic表)
lastReplyDate = now() (用系统时间更新topic表)
lastReplyUser = user (更新reply发表回复的用户字段topic表)


我在dwmx的update窗口输入下面的sql语句
UPDATE topic
SET ViewCount = ViewCount + 1, replycount='"&Session("rsreply_total")&"' , lastReplyDate =now(), lastreplyUser='"&Session("MM_user")&"'
WHERE id = SPColparam

然后设置变量
SPColparam Request.querystring("id")

注意我的lastreplyUser='"&Session("MM_user")&"' 用的和上面的不同。上面用的是lastreplyUser='"&Session("MM_Username")&"'
上面的id字段代表topic的id字段,reply表也有这个字段,他们的关系是一对多。

这样得到的代码是:
<%

set cmdUpdcount = Server.CreateObject("ADODB.Command")
cmdUpdcount.ActiveConnection = MM_connFreeBoard_STRING
cmdUpdcount.CommandText = "UPDATE topic SET ViewCount = ViewCount + 1, replycount='"&Session("rsreply_total")&"' , lastReplyDate =now(), lastreplyUser='"&Session("MM_user")&"' WHERE id = " + Replace(cmdUpdcount__SPColparam, "'", "''") + ""
cmdUpdcount.CommandType = 1
cmdUpdcount.CommandTimeout = 0
cmdUpdcount.Prepared = true
cmdUpdcount.Execute()

%>

刷新包含这段代码的回复页出现500服务器错误
当我双击server behaiver 面版里面的update语句,打开update窗口的时候
里面只剩下这样的代码
UPDATE topic
SET ViewCount = ViewCount + 1, replycount='SPColparam
WHERE

??
我输入的sql语句有什么问题呢?