sql先分组后按时间排序

CoffeePhoton 2012-04-13 10:17:00
实在搞不定了,发帖问下。

我在做一个评论系统,评论分一级、二级,所有评论都在同一张表——Comment。这是数据结构,很简单的,一看就懂。




现在我想通过一条sql查出某篇文章下所有评论,就差排序没做好了,望高手指教~~

最终需要的结果:

1、先根据一级评论按时间正序(asc)排列,即 articleId 有值的。
2、再把一级评论对应的二级评论排到父级评论后,而且还要按时间正序排列。


在上面截图中,已经按时间排序了,这样不对,还要把commentId相同的结果放到一起
...全文
3986 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
CoffeePhoton 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

上面那些截图都没显示完,请“右键新标签页打开”查看全图!


我的一种假设:

1、把二级评论排到各自对应的一级评论后,按时间asc排序。
2、给一级评论排序,也按时间asc。同时,如果一级评论下存在二级评论,则这些二级评论也跟着一级评论走,不掉队。
3、最终效果以一级评论为优先级,保证所有一级评论时间最早的排在最前(asc),下面有二级评论的按同样的时间顺序排列。

说明:a……
[/Quote]


额,我的想法是希望一条sql能查出某篇文章下所有评论,放到一个list,顺序就是最终页面显示时的顺序。页面循环显示的时候只需要判断 articleId 等于 “null”的就属于二级评论,margin-left: 70px,给一个错位就OK。

刚才在oschina看到个劲爆答案:


select b.id, b.articleId, b.commentId, b.commentTime from Comment a , Comment b
where ((a.id = b.id ) or (a.id = b.commentId)) and a.articleId = 'bd3f3e72359c96e201359e85f0940001' and b.hidden = '1'
order by a.commentTime, b.commentTime asc;


不用嵌套查询,不用union,不用loop,这样就实现数据2级排序了。

另外还发现一个规律,牛人都是昼伏夜出型的~~ 一般晚上1、2点最活跃
xiaoxiangqing 2012-04-16
  • 打赏
  • 举报
回复
没看明白明目意思
paperen 2012-04-16
  • 打赏
  • 举报
回复
结果集合 = query( select * from Comment order by asc );
replyData // 回复评论数据变量
commentData // 评论数据变量
foreach( 结果集合 as 每条记录 )
{
if( 每条记录['arcticleId'] == NULL )
{
replyData[每条记录['commentId']] = 每条记录; // 用arcticleId作为索引
}
else
{
commentData[] = 每条记录;
}
}

那么显示的时候
foreach( commentData as comment )
{
输出 comment; // 一级评论
if ( 存在( replyData[comment['arcticleId']] ) )
{
foreach( replyData[comment['arcticleId']] as reply )
{
输出 reply; // 二级评论
}
}
}

这个方法只针对二级的情况

还有你的ID用不用搞那么长啊…貌似不太利于查询效率,二级评论最好也填上arcticleId(个人觉得)
CoffeePhoton 2012-04-14
  • 打赏
  • 举报
回复
上面那些截图都没显示完,请“右键新标签页打开”查看全图!


我的一种假设:

1、把二级评论排到各自对应的一级评论后,按时间asc排序。
2、给一级评论排序,也按时间asc。同时,如果一级评论下存在二级评论,则这些二级评论也跟着一级评论走,不掉队。
3、最终效果以一级评论为优先级,保证所有一级评论时间最早的排在最前(asc),下面有二级评论的按同样的时间顺序排列。

说明:articleId不为“null”的就是一级评论,或者commentId为“null”的。


现在能通过一条sql把文章所有评论查出来了,就差排序问题。
select c.* from Comment c where c.articleId = 'bd3f3e72359c96e201359e85f0940001'
union select a.* from Comment a inner loop join Comment b on a.commentId = b.id
and b.articleId = 'bd3f3e72359c96e201359e85f0940001'


疑问:这个不用分组能排出来吗?
CoffeePhoton 2012-04-14
  • 打赏
  • 举报
回复
诶,再次检查还是有问题!

上面按三种字段排序能解决二级评论问题,一级评论还是乱的:




新添加的一级评论应该排在最后,也不知道他为什么会排在第一位。
CoffeePhoton 2012-04-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:
想起一件事,我数据里的 null 是字符串 “null”,这样貌似不能用 isnull 方法吧


SQL code
order by
case when commentId='null' then id else commentId end,
commentId,
commenttime
[/Quote]


这次结果也不对,但我把排序顺序稍微调整下就对了,

order by case when r.commentId = 'null' then id else commentId end, r.commentTime, r.commentId asc;

现在正确结果:





想到以前做这个相当复杂,首先用户点击文章标题超链接获得文章ID,

根据文章ID查询所有一级评论:select c.* from Comment c where c.articleId = 'bd3f3e72359c96e201359e85f0940001',把结果集放到一个list里。

再用java循环list,查出每条一级评论对应的所有二级评论:select c.* from Comment c where c
.commentId = 'bd3f3e7235ac09000135ae066cd60004',把所有二级评论放到一个tempList。

最后把2个list发送到jsp页面显示,诶,太麻烦了,查N次数据库!

这几天决定优化,现在一条sql搞定,效率应该高不少 ^_^
百年树人 2012-04-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
想起一件事,我数据里的 null 是字符串 “null”,这样貌似不能用 isnull 方法吧
[/Quote]

order by
case when commentId='null' then id else commentId end,
commentId,
commenttime
CoffeePhoton 2012-04-13
  • 打赏
  • 举报
回复
想起一件事,我数据里的 null 是字符串 “null”,这样貌似不能用 isnull 方法吧
CoffeePhoton 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

try
SQL code
order by
isnull(commentId,id),
commentId,
commenttime
[/Quote]


也不行啊,跟上面仁兄一样结果:

寂小魔 2012-04-13
  • 打赏
  • 举报
回复
躺地上学习中……
百年树人 2012-04-13
  • 打赏
  • 举报
回复
try
order by
isnull(commentId,id),
commentId,
commenttime
CoffeePhoton 2012-04-13
  • 打赏
  • 举报
回复
csdn做得点都不好,上面图片没显示完,右键“新窗口打开”看全图
CoffeePhoton 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

order by commentid+convert(varchar(19),commenttime,120)
[/Quote]

结果:


也不行,好像是把 commentId 不为空的放到最前面,不满足第一个条件——先把一级评论按正序排列。
-狙击手- 2012-04-13
  • 打赏
  • 举报
回复
order by commentid+convert(varchar(19),commenttime,120)
CoffeePhoton 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

看不明白
[/Quote]


简单分析下:

//查出所有一级评论
select c.* from Comment c where c.articleId = 'bd3f3e72359c96e201359e85f0940001'

//循环查出所有二级评论
select a.* from Comment a inner loop join Comment b on a.commentId = b.id
and b.articleId = 'bd3f3e72359c96e201359e85f0940001'

union 合并到一起就是某篇文章所有评论了
代码兔 2012-04-13
  • 打赏
  • 举报
回复
看不明白

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧