一个类似发贴回帖的排序问题

一个类似发贴回帖的排序问题

快过年了,没事上到csdn,看到有一问题,顶有意思,想了很久,终于可以找到一个解决的方法,虽然问题主人已经结帖,没有分数,但还是回个帖子,毕竟自己辛苦的结果嘛。也顺便来来这里与大家分享一下。
原来问题:

[@more@] 一个类似发贴回帖的排序问题

快过年了,没事上到csdn,看到有一问题,顶有意思,想了很久,终于可以找到一个解决的方法,虽然问题主人已经结帖,没有分数,但还是回个帖子,毕竟自己辛苦的结果嘛。也顺便来来这里与大家分享一下。
原来问题:
TABLE [A] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[t_date] [datetime] NULL ,
[type_code] [int] NULL ,
CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [B] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[t_date] [datetime] NULL ,
[type_code] [int] NULL ,
CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO

insert into A values('1','1900-01-02','0' )
insert into A values('2','1900-01-03','0' )
insert into A values('3','1900-01-04','0' )
insert into A values('4','1900-01-05','0' )
insert into A values('5','1900-01-06','0' )
insert into A values('6','1900-01-07','0' )

insert into B values('1','1900-02-02','3' )
insert into B values('2','1900-02-03','2' )
insert into B values('3','1900-02-04','1' )
insert into B values('4','1900-02-05','5' )
insert into B values('5','1900-02-06','5' )
insert into B values('7','1900-02-07','1' )
insert into B values('8','1900-02-08','1' )
insert into B values('9','1900-02-09','1' )
insert into B values('10','1900-02-10','1' )
insert into B values('11','1900-02-11','2' )
insert into B values('12','1900-02-12','2' )
insert into B values('13','1900-02-13','2' )
insert into B values('14','1900-02-14','4' )

两表的关系是 A.id=B.type_code
现在我能得到的是
select id,t_date,type_code from(
select distinct A.*,A.id as asp from A,B
where A.id=B.type_code
union all
select B.*,B.type_code as asp from A,B
where A.id=B.type_code ) as bb
order by asp desc,type_code
结果如下:
id t_date type_code
------------------------------------------------------------------
51900-01-09 00:00:00.0000
41900-02-05 00:00:00.0005
51900-02-06 00:00:00.0005
41900-01-05 00:00:00.0000
141900-02-14 00:00:00.0004
31900-01-04 00:00:00.0000
11900-02-02 00:00:00.0003
21900-01-03 00:00:00.0000
21900-02-03 00:00:00.0002
111900-02-11 00:00:00.0002
121900-02-12 00:00:00.0002
131900-02-13 00:00:00.0002
11900-01-02 00:00:00.0000
31900-02-04 00:00:00.0001
91900-02-09 00:00:00.0001
101900-02-10 00:00:00.0001
71900-02-07 00:00:00.0001
81900-02-08 00:00:00.0001
现在我想知道怎么按时间排序,这是一个bbs类似的标题与回复问题
但不同的是我想让回复的时间的来排列 看上去数据比较冗余 要是心情好的时候 帮我看看 sql怎么写
---------想要的东西如下------------
id t_date type_code
-----------------------------------
41900-01-05 00:00:00.0000
141900-02-14 00:00:00.0004
21900-01-03 00:00:00.0000
21900-02-03 00:00:00.0002
111900-02-11 00:00:00.0002
121900-02-12 00:00:00.0002
131900-02-13 00:00:00.0002
11900-01-02 00:00:00.0000
31900-02-04 00:00:00.0001
91900-02-09 00:00:00.0001
101900-02-10 00:00:00.0001
71900-02-07 00:00:00.0001
81900-02-08 00:00:00.0001
51900-01-09 00:00:00.0000
41900-02-05 00:00:00.0005
51900-02-06 00:00:00.0005
31900-01-04 00:00:00.0000
11900-02-02 00:00:00.0003

/*
思想:
查询1:把最后回复的帖子排序在前面(按降),而且每一贴的最后回复放在前面(不包含主帖,按降序)
查询2:把最后回复的帖子排序在前面(按降),回贴按回帖日期排序(升序)
(这是通常的论坛查询方式)
*/

查询1:
SELECT * INTO #Temp FROM A WHERE EXISTS(SELECT 1 FROM B WHERE A.id=B.type_code)
UNION ALL
SELECT * FROM B WHERE EXISTS(SELECT 1 FROM A WHERE A.id=B.type_code)

SELECT A1.*
FROM #Temp AS A1 INNER JOIN
(SELECT type_code,MAX(t_date) AS t_date FROM B GROUP BY type_code) AS B1 ON B1.type_code=(CASE A1.type_code WHEN 0 THEN A1.id ELSE A1.type_code END)
ORDER BY B1.t_date desc,A1.type_code,A1.t_date desc

DROP TABLE #Temp
查询2:
SELECT * INTO #Temp FROM A WHERE EXISTS(SELECT 1 FROM B WHERE A.id=B.type_code)
UNION ALL
SELECT * FROM B WHERE EXISTS(SELECT 1 FROM A WHERE A.id=B.type_code)

SELECT A1.*
FROM #Temp AS A1 INNER JOIN
(SELECT type_code,MAX(t_date) AS t_date FROM B GROUP BY type_code) AS B1 ON B1.type_code=(CASE A1.type_code WHEN 0 THEN A1.id ELSE A1.type_code END)
ORDER BY B1.t_date desc,A1.type_code,A1.t_date

DROP TABLE #Temp

结果1:
结果1

结果2:

结果2

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7764484/viewspace-898174/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7764484/viewspace-898174/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值