简单分析下://查出所有一级评论 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 合并到一起就是某篇文章所有评论了
order by commentid+convert(varchar(19),commenttime,120)
try order by isnull(commentId,id), commentId, commenttime
想起一件事,我数据里的 null 是字符串 “null”,这样貌似不能用 isnull 方法吧
order by case when commentId='null' then id else commentId end, commentId, commenttime
这次结果也不对,但我把排序顺序稍微调整下就对了,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搞定,效率应该高不少 ^_^
上面那些截图都没显示完,请“右键新标签页打开”查看全图! 我的一种假设: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'疑问:这个不用分组能排出来吗?
额,我的想法是希望一条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点最活跃
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 合并到一起就是某篇文章所有评论了
结果:
也不行,好像是把 commentId 不为空的放到最前面,不满足第一个条件——先把一级评论按正序排列。
order by
isnull(commentId,id),
commentId,
commenttime
order by
case when commentId='null' then id else commentId end,
commentId,
commenttime
现在正确结果:想到以前做这个相当复杂,首先用户点击文章标题超链接获得文章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搞定,效率应该高不少 ^_^
我的一种假设: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'疑问:这个不用分组能排出来吗?
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(个人觉得)
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点最活跃