首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求一SQL语句:按时间排序,该怎么解决

2012-03-26 
求一SQL语句:按时间排序是这样的有个讨论模块发帖主表A-----------------------------A.idA.发帖内容A.发

求一SQL语句:按时间排序
是这样的  

有个讨论模块

发帖主表   A
-----------------------------
A.id       A.发帖内容     A.发帖时间


回贴表     B
-----------------------------------------
B.id     主表ID(A.id)   B.回复内容   B.回复时间


现在想通过SQL语句实现这样的功能:在列表页中显示主要A的记录按照最后回复时间或最新发表时间进行排序,即哪个贴是最后被回复了,就排在第一位,哪个贴是最新发表的也是排在前面。


谢谢大家的帮忙

[解决办法]
select A.发帖内容 , A.发帖时间 时间 from a where a.id not in (select b.id from b)
union all
select A.发帖内容 , b.回复时间 时间 from a, b where a.id = b.id
order by 时间 desc
[解决办法]
select A.发帖内容 , A.发帖时间 时间 from a where a.id not in (select b.主表ID from b)
union all
select A.发帖内容 , b.回复时间 时间 from a, b where a.id = b.主表ID
order by 时间 desc

[解决办法]
select
t.*
from
发帖主表A t
order by
isnull((select max(回复时间) from 回贴表B where 主表ID=t.ID order by ),t.发帖时间)
[解决办法]
select
t.*
from
发帖主表A t
order by
isnull((select max(回复时间) from 回贴表B where 主表ID=t.ID order by ),t.发帖时间) DESC
[解决办法]
select A.发帖内容 , A.发帖时间 时间 from a where a.id not in (select b.主表ID from b)
union all
select A.发帖内容 , max(b.回复时间) 时间 from a, b where a.id = b.主表ID group by a.id
order by 时间 desc

[解决办法]
我的最后一个才对.
[解决办法]
select * from
(
select A.id, A.发帖内容 , A.发帖时间
from A
union
select A.id, A.发帖内容 ,B.回复时间
from a inner join b on a.id=b.主表ID) C
ORDER BY 发帖时间
[解决办法]
select distinct a.*,b1.回复时间 as 最后回复时间
from a
join b b1
on a.id = b1.主表ID
and not exsits(
select 1 from b where 主表ID = b1.主表ID and b1.回复时间 < b.回复时间
)
order by 最后回复时间 desc
[解决办法]
老大们都没我写的好,呵呵
[解决办法]
楼上的老大们都写得很好,,,
[解决办法]
--改改
select distinct a.*,isnull(b1.回复时间,a.发帖时间) as 最后回复时间
from a
left join b b1
on a.id = b1.主表ID
and not exsits(
select 1 from b where 主表ID = b1.主表ID and b1.回复时间 < b.回复时间
)
order by 最后回复时间 desc

[解决办法]
declare @a table(id int identity(1,1),发帖内容 varchar(20),发帖时间 datetime)
insert @a
select 'a ', '2007-09-01 '
union all
select 'b ', '2007-08-15 '
declare @b table(id int identity(1,1),aid int,回复内容 varchar(20),回复时间 datetime)
insert @b
select 2, 'bbb ', '2007-09-02 '
union all
select 1, 'aaa ', '2007-09-03 '

select 发帖内容,发帖时间 as 时间 from @a
union all
select 回复内容,回复时间 as 时间 from @b
order by 时间 desc


/*

(所影响的行数为 2 行)


(所影响的行数为 2 行)

发帖内容 时间


-------------------- ------------------------------------------------------
aaa 2007-09-03 00:00:00.000
bbb 2007-09-02 00:00:00.000
a 2007-09-01 00:00:00.000
b 2007-08-15 00:00:00.000

(所影响的行数为 4 行)
*/
[解决办法]
--才发现写错了,把两个不同的语句合在一个里了。

select
t.*
from
发帖主表A t
order by
isnull((select max(回复时间) from 回贴表B where 主表ID=t.ID),t.发帖时间) DESC


select
t.*
from
发帖主表A t
order by
isnull((select top 1 回复时间 from 回贴表B where 主表ID=t.ID order by 回复时间 Desc),t.发帖时间) DESC

[解决办法]
看错题目了!!晕 !!
偶该休息休息了 !!!
[解决办法]

declare @a table(id int identity(1,1),发帖内容 varchar(20),发帖时间 datetime)
insert @a
select 'a ', '2007-09-01 '
union all
select 'b ', '2007-08-15 '
declare @b table(id int identity(1,1),aid int,回复内容 varchar(20),回复时间 datetime)
insert @b
select 2, 'bbb ', '2007-09-03 '
union all
select 1, 'aaa ', '2007-09-01 '

select c.*, d.回复时间 from @a c left join (
select top 1000000 a.id,b.aid,b.回复时间 from @b b,@a a where a.id=b.aid order by b.回复时间 desc) d
on c.id=d.aid
order by d.回复时间 desc

/*

(所影响的行数为 2 行)


(所影响的行数为 2 行)

id 发帖内容 发帖时间 回复时间
----------- -------------------- ------------------------------------------------------ ------------------------------------------------------
2 b 2007-08-15 00:00:00.000 2007-09-03 00:00:00.000
1 a 2007-09-01 00:00:00.000 2007-09-01 00:00:00.000

(所影响的行数为 2 行)

*/
[解决办法]
答案楼上高手都写了,我就不献丑了。

我说说我的想法。对于这种情况,我宁愿以冗余换效率。在A表加一个回复时间字段,默认等于发贴时间;有回复时顺便更新这个字段。
[解决办法]
select
t.*
from
发帖主表A t
order by
isnull((select max(回复时间) from 回贴表B where 主表ID=t.ID),t.发帖时间) DESC


select
t.*
from
发帖主表A t
order by
isnull((select top 1 回复时间 from 回贴表B where 主表ID=t.ID order by 回复时间 Desc),t.发帖时间) DESC

热点排行