本帖最后由 CoffeePhoton 于 2012-04-13 22:24:34 编辑

解决方案 »

  1.   

    简单分析下://查出所有一级评论
    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 合并到一起就是某篇文章所有评论了
      

  2.   

    order by  commentid+convert(varchar(19),commenttime,120)
      

  3.   


    结果:
    也不行,好像是把 commentId 不为空的放到最前面,不满足第一个条件——先把一级评论按正序排列。
      

  4.   

    csdn做得点都不好,上面图片没显示完,右键“新窗口打开”看全图
      

  5.   

    try
    order by
      isnull(commentId,id),
      commentId,
      commenttime
      

  6.   

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

  7.   


    order by
      case when commentId='null' then id else commentId end,
      commentId,
      commenttime
      

  8.   

    这次结果也不对,但我把排序顺序稍微调整下就对了,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搞定,效率应该高不少 ^_^
      

  9.   

    上面那些截图都没显示完,请“右键新标签页打开”查看全图!
    我的一种假设: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'疑问:这个不用分组能排出来吗?
      

  10.   

    结果集合 = 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(个人觉得)
      

  11.   

    额,我的想法是希望一条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点最活跃