有三张表:
用户表user(id,name, 。)
发帖表release(id, userid, title, content,date,type,score, 。)//type表示帖子是否解决,int类型
回帖表replay(id, userid, releaseid,content,date, 。)
表的字段太多,就不写上了。同csdn论坛上的查询效果,要怎么写sql. 主要就是一个多表查询的问题,根据release的type查出按回帖时间(没有回帖就看发帖时间)先后排序后的前20条记录。
实例

解决方案 »

  1.   


      select a.id, a.userid, a.releaseid,a.content,a.date,a.type ...
        from (select id, userid, releaseid,content,date,type... from release
               union 
              select id, userid, releaseid,content,date,type... from replay) a
       where a.type = 'xxx'
    order by a.date
    ??
      

  2.   

    left join ??select top 20 * from release a left join replay b on b.releaseid=a.id
                                   left join user c on  c.id=b.userid
    order by b.date (desc、asc),a.date
    where a.type=1
      

  3.   

    order by 和where f反了
      

  4.   

    你的难点就是case when then 的用法和  Isnull(回复人字段,发布人字段)这些的用法,具体的我就不写了,等楼下的人给出具体的语句。
      

  5.   

    select B.id,B.title,B.date,B.score,ISNULL(A.name,Select top 1 E.name from release D LEFT JOIN user E ON D.userid=E.id) as replayName, Case when A.name is null then
    C.date Else C.date end as replayDate from release  B  left join replay C on B.id=C.releaseid left join A on A.id=C.userid 
    你看看这句是不是只查出来了
    帖子id,帖子题目,帖子发表人,帖子发表时间,帖子分数,最后回复人(如果没有回复人,就认为是帖子发布人),最后回复时间(如果没有回复人,就认为是帖子发布人发帖时间)。应该有很多条。。前面有很多字段是相同的。
      

  6.   

    如果是对的,再加上Group by及Sum(1) as replayNum就成了。
      

  7.   

    你的答案不是很正确。sql里没有查询出发帖人名字,只查出回复人名字。
    因为你的release B left join replay C on B.id=C.releaseid left join A on A.id=C.userid user表和replay表通过release表连结,我不知道要怎样获得发帖人名字。
      

  8.   

    好复杂!乱写了一个,mssql的
    select 
    r.id 帖子id
    ,r.title 帖子题目
    ,u1.name 帖子发表人
    ,r.date 帖子发表时间
    ,r.score 帖子分数
    ,r.replycount 帖子回复数
    ,isnull(u2.name,u1.name) 最后回复人
    ,isnull(rp .date,r.date) 最后回复时间
    (select top 20 
      id,
      userid,
      title,
      content,
      date,
      type,
      score,
      (select max(id) from replay where releaseid=rel.id) replyid,
       (select count(1) from replay where releaseid=rel.id) replycount
     from release  rel where type='xxx' order by date desc) as r
    left join replay rp on rp.replyid=replay.id
    left join user u1 on u1.id= r.userid
    left join user u2 on u2.id=rp.userid
      

  9.   


    select top 20 * from(select a.id,a.type as 状态,a.title,a.score as 分数,
    c.name+','+a.date as 发帖人 ,isnull(b.replycount,0) as 回复次数,isnull(b.lastreplydate,a.date)+','+isnull(b.date,a.date) as 最后回复 from release a join replay b on a.id=b.releaseid join user c on a.userid=c.userid and b.userid=c.id)as t
      

  10.   

    user是SQL里的关键字  查询的时候加上中括号,刚在另外个帖子学习的
      

  11.   

    晕倒啊,你在前面加个A.name不就是发贴人的名字了么?我当时没注意,没写上去。
      

  12.   

    错了,你得单独连接查询,
    Select top 1 E.name from release D LEFT JOIN user E ON D.userid=E.id这句就是在查发贴人的名字