表topic:
id title
1 你好
2 我不好
表reply:
id topic floor title addTime
1 1 null 回复:你好 <日期时间>
2 2 null 回复:我不好 <日期时间>
3 1 null 回复:你好 <日期时间>
4 2 null 回复:我不好 <日期时间>
我想执行如下操作
select id from topic
然后循环取到的
select floor from reply where topic=<表topic的id> order by addTime desc
然后再根据时间来更新floor, 从1开始
rs("floor")=1
rs.movenext()
rs("floor")=2
然后再继续下一条topic的记录
最后则变成
表reply:
id topic floor title addTime
1 1 1 回复:你好 <日期时间>
2 2 1 回复:我不好 <日期时间>
3 1 2 回复:你好 <日期时间>
4 2 2 回复:我不好 <日期时间>
由于数据量非常大, 通过程序来嵌套循环来更新速度非常慢,
请问能够通过SQL来实现吗? 不好意思, 存储过程还不是很懂...
10 个解决方案
#1
不知道各位有没有看懂我所说的...
#2
分组排序的功能参考
http://topic.csdn.net/u/20080324/10/82f22176-5d58-4683-8cab-8732b9b33d69.html
http://topic.csdn.net/u/20080324/10/82f22176-5d58-4683-8cab-8732b9b33d69.html
#3
然后再根据时间来更新floor, 从1开始
------------------------------
对这句话不是很明白,是说按时间从大到小或从小到大,然后根据topic里的ID循环赋值?
------------------------------
对这句话不是很明白,是说按时间从大到小或从小到大,然后根据topic里的ID循环赋值?
#4
哦...原来这个叫做分组排序啊, 谢谢..我看看...
#5
饿...明白的说吧,
假设现在有一个 帖子 表, 里面有100篇帖子,
有另一个 回复 表, 里面有10000篇回复, 回复有个字段是对应的帖子
现在我就是想, 回复表 里面的每个记录, 根据发表时间 来生成一个 楼层号
楼层号从1开始, 越后面发表的楼层号就越高, 步长为1
回复表里面会有很多个帖子的回复, 所以回复的楼层号并不是惟一的,
例如一个回复的楼层号为1, 他对应第1篇帖子,
但另一个回复的楼层号也为1, 他是第2篇帖子的第1篇回复
可以这样理解, 假设如下表
id, fromTopic, addTime, floor
1 1 1
2 4 2
3 2 3
4 2 4
5 1 5
先按addTime取fromTopic=1的记录, 再根据发布时间顺序生成楼层ID,并更新到floor
然后再取fromTopic=2的记录...
fromTopic=1,2,3,4 这个数字必须是topic表中有的,
也就是说先查询topic表, 帖子的id是惟一的并开始循环
再根据topic的id查询reply表 reply.fromTopic=topic.id
再更新楼层号
然后再继续下一个topic的记录
假设现在有一个 帖子 表, 里面有100篇帖子,
有另一个 回复 表, 里面有10000篇回复, 回复有个字段是对应的帖子
现在我就是想, 回复表 里面的每个记录, 根据发表时间 来生成一个 楼层号
楼层号从1开始, 越后面发表的楼层号就越高, 步长为1
回复表里面会有很多个帖子的回复, 所以回复的楼层号并不是惟一的,
例如一个回复的楼层号为1, 他对应第1篇帖子,
但另一个回复的楼层号也为1, 他是第2篇帖子的第1篇回复
可以这样理解, 假设如下表
id, fromTopic, addTime, floor
1 1 1
2 4 2
3 2 3
4 2 4
5 1 5
先按addTime取fromTopic=1的记录, 再根据发布时间顺序生成楼层ID,并更新到floor
然后再取fromTopic=2的记录...
fromTopic=1,2,3,4 这个数字必须是topic表中有的,
也就是说先查询topic表, 帖子的id是惟一的并开始循环
再根据topic的id查询reply表 reply.fromTopic=topic.id
再更新楼层号
然后再继续下一个topic的记录
#6
--明白了,我下面使用的是id<t.id,你换用addtime < t.addtime即可.
create table tb(id int,topic int,[floor] int, title varchar(20), addTime varchar(20))
insert into tb values(1, 1, null , '回复:你好' , '<日期时间>')
insert into tb values(2, 2, null , '回复:我不好', '<日期时间>')
insert into tb values(3, 1, null , '回复:你好' , '<日期时间>')
insert into tb values(4, 2, null , '回复:我不好', '<日期时间>')
go
select id , topic , [floor] = (select count(*) from tb where topic = t.topic and id < t.id) + 1 , title , addtime from tb t
drop table tb
/*
id topic floor title addtime
----------- ----------- ----------- -------------------- --------------------
1 1 1 回复:你好 <日期时间>
2 2 1 回复:我不好 <日期时间>
3 1 2 回复:你好 <日期时间>
4 2 2 回复:我不好 <日期时间>
(所影响的行数为 4 行)
*/
#7
谢谢楼上,我马上试试
#8
谢谢楼上, 我已经弄好了, 把代码发上来
根本就不需要用到Topic这个表, 这样既节省时间, 也免去了很多不必要的查询
是我把问题想得太复杂了... 其实这个用法我早就会了.......为什么我没有想到呢? 这就是差距..... 55555555555
我本来是想这样用程序来实现, 或者使用存储过程, 反正就是想的很复杂就是了, 没有找到这个投机取巧的方法...
今天早上已经更新过一次了, 就是用的下面的程序来实现的, 花了个把小时才执行完
刚刚团然发现自己粗心把 order by 写反了... 就想到看能不能直接用SQL来解决... 55555555555
谢谢楼上的各位达人...
update ddBbsReply set ddFloor =
(
select count(*)
from ddBbsReply
where ddAttachTopic = ddReply.ddAttachTopic
and ddAddTime < ddReply.ddAddTime
) + 1
from ddBbsReply ddReply
根本就不需要用到Topic这个表, 这样既节省时间, 也免去了很多不必要的查询
是我把问题想得太复杂了... 其实这个用法我早就会了.......为什么我没有想到呢? 这就是差距..... 55555555555
我本来是想这样用程序来实现, 或者使用存储过程, 反正就是想的很复杂就是了, 没有找到这个投机取巧的方法...
今天早上已经更新过一次了, 就是用的下面的程序来实现的, 花了个把小时才执行完
刚刚团然发现自己粗心把 order by 写反了... 就想到看能不能直接用SQL来解决... 55555555555
var rs=createRecordset()
var rs2=createRecordset()
rs.open("select * from ddBbsTopic")
for(var i=0; i<rs.recordcount; i++){
rs2.open("select * from ddBbsReply where ddAttachTopic='"+rs("ddTopicID")+"' order by ddAddTime")
for(var o=0; o<rs2.recordcount; o++){
rs2("ddFloor")=(o+1)
rs2.moveNext()
}
rs2.close
}
recycle(rs2)
recycle(rs)
谢谢楼上的各位达人...
#9
不用谢,接分的
#10
其实我在想, 为什么update要有from子句呢?
update xxx set xxx=(select xxx from xxx)
update xxx set xxx='xxx'
貌似都不需要from子句, 可是上面那条sql没有from却又不能执行
from子句在update语句中到底是有什么作用呢?
update xxx set xxx=(select xxx from xxx)
update xxx set xxx='xxx'
貌似都不需要from子句, 可是上面那条sql没有from却又不能执行
from子句在update语句中到底是有什么作用呢?
#1
不知道各位有没有看懂我所说的...
#2
分组排序的功能参考
http://topic.csdn.net/u/20080324/10/82f22176-5d58-4683-8cab-8732b9b33d69.html
http://topic.csdn.net/u/20080324/10/82f22176-5d58-4683-8cab-8732b9b33d69.html
#3
然后再根据时间来更新floor, 从1开始
------------------------------
对这句话不是很明白,是说按时间从大到小或从小到大,然后根据topic里的ID循环赋值?
------------------------------
对这句话不是很明白,是说按时间从大到小或从小到大,然后根据topic里的ID循环赋值?
#4
哦...原来这个叫做分组排序啊, 谢谢..我看看...
#5
饿...明白的说吧,
假设现在有一个 帖子 表, 里面有100篇帖子,
有另一个 回复 表, 里面有10000篇回复, 回复有个字段是对应的帖子
现在我就是想, 回复表 里面的每个记录, 根据发表时间 来生成一个 楼层号
楼层号从1开始, 越后面发表的楼层号就越高, 步长为1
回复表里面会有很多个帖子的回复, 所以回复的楼层号并不是惟一的,
例如一个回复的楼层号为1, 他对应第1篇帖子,
但另一个回复的楼层号也为1, 他是第2篇帖子的第1篇回复
可以这样理解, 假设如下表
id, fromTopic, addTime, floor
1 1 1
2 4 2
3 2 3
4 2 4
5 1 5
先按addTime取fromTopic=1的记录, 再根据发布时间顺序生成楼层ID,并更新到floor
然后再取fromTopic=2的记录...
fromTopic=1,2,3,4 这个数字必须是topic表中有的,
也就是说先查询topic表, 帖子的id是惟一的并开始循环
再根据topic的id查询reply表 reply.fromTopic=topic.id
再更新楼层号
然后再继续下一个topic的记录
假设现在有一个 帖子 表, 里面有100篇帖子,
有另一个 回复 表, 里面有10000篇回复, 回复有个字段是对应的帖子
现在我就是想, 回复表 里面的每个记录, 根据发表时间 来生成一个 楼层号
楼层号从1开始, 越后面发表的楼层号就越高, 步长为1
回复表里面会有很多个帖子的回复, 所以回复的楼层号并不是惟一的,
例如一个回复的楼层号为1, 他对应第1篇帖子,
但另一个回复的楼层号也为1, 他是第2篇帖子的第1篇回复
可以这样理解, 假设如下表
id, fromTopic, addTime, floor
1 1 1
2 4 2
3 2 3
4 2 4
5 1 5
先按addTime取fromTopic=1的记录, 再根据发布时间顺序生成楼层ID,并更新到floor
然后再取fromTopic=2的记录...
fromTopic=1,2,3,4 这个数字必须是topic表中有的,
也就是说先查询topic表, 帖子的id是惟一的并开始循环
再根据topic的id查询reply表 reply.fromTopic=topic.id
再更新楼层号
然后再继续下一个topic的记录
#6
--明白了,我下面使用的是id<t.id,你换用addtime < t.addtime即可.
create table tb(id int,topic int,[floor] int, title varchar(20), addTime varchar(20))
insert into tb values(1, 1, null , '回复:你好' , '<日期时间>')
insert into tb values(2, 2, null , '回复:我不好', '<日期时间>')
insert into tb values(3, 1, null , '回复:你好' , '<日期时间>')
insert into tb values(4, 2, null , '回复:我不好', '<日期时间>')
go
select id , topic , [floor] = (select count(*) from tb where topic = t.topic and id < t.id) + 1 , title , addtime from tb t
drop table tb
/*
id topic floor title addtime
----------- ----------- ----------- -------------------- --------------------
1 1 1 回复:你好 <日期时间>
2 2 1 回复:我不好 <日期时间>
3 1 2 回复:你好 <日期时间>
4 2 2 回复:我不好 <日期时间>
(所影响的行数为 4 行)
*/
#7
谢谢楼上,我马上试试
#8
谢谢楼上, 我已经弄好了, 把代码发上来
根本就不需要用到Topic这个表, 这样既节省时间, 也免去了很多不必要的查询
是我把问题想得太复杂了... 其实这个用法我早就会了.......为什么我没有想到呢? 这就是差距..... 55555555555
我本来是想这样用程序来实现, 或者使用存储过程, 反正就是想的很复杂就是了, 没有找到这个投机取巧的方法...
今天早上已经更新过一次了, 就是用的下面的程序来实现的, 花了个把小时才执行完
刚刚团然发现自己粗心把 order by 写反了... 就想到看能不能直接用SQL来解决... 55555555555
谢谢楼上的各位达人...
update ddBbsReply set ddFloor =
(
select count(*)
from ddBbsReply
where ddAttachTopic = ddReply.ddAttachTopic
and ddAddTime < ddReply.ddAddTime
) + 1
from ddBbsReply ddReply
根本就不需要用到Topic这个表, 这样既节省时间, 也免去了很多不必要的查询
是我把问题想得太复杂了... 其实这个用法我早就会了.......为什么我没有想到呢? 这就是差距..... 55555555555
我本来是想这样用程序来实现, 或者使用存储过程, 反正就是想的很复杂就是了, 没有找到这个投机取巧的方法...
今天早上已经更新过一次了, 就是用的下面的程序来实现的, 花了个把小时才执行完
刚刚团然发现自己粗心把 order by 写反了... 就想到看能不能直接用SQL来解决... 55555555555
var rs=createRecordset()
var rs2=createRecordset()
rs.open("select * from ddBbsTopic")
for(var i=0; i<rs.recordcount; i++){
rs2.open("select * from ddBbsReply where ddAttachTopic='"+rs("ddTopicID")+"' order by ddAddTime")
for(var o=0; o<rs2.recordcount; o++){
rs2("ddFloor")=(o+1)
rs2.moveNext()
}
rs2.close
}
recycle(rs2)
recycle(rs)
谢谢楼上的各位达人...
#9
不用谢,接分的
#10
其实我在想, 为什么update要有from子句呢?
update xxx set xxx=(select xxx from xxx)
update xxx set xxx='xxx'
貌似都不需要from子句, 可是上面那条sql没有from却又不能执行
from子句在update语句中到底是有什么作用呢?
update xxx set xxx=(select xxx from xxx)
update xxx set xxx='xxx'
貌似都不需要from子句, 可是上面那条sql没有from却又不能执行
from子句在update语句中到底是有什么作用呢?