一个论坛,有两个表posts 这是用户发贴表
id,forum_id,title,content,postatforum 这是版面表
id,name,man现在要用一个查询来得到某一时段内的各版面发贴排名:select f.id,f.name,count(p.id) as posts_num 
from posts p left join forum f on p.forum_id=f.id
where p.postat='20070801'
group by f.id 
order by posts_num desc这时得到结果:
id      name         posts_num
1 谈天说地    34
3 衣食住行    31
2 互通有无    26
9 收藏天地    11
5 游山玩水    9但问题目是,论坛里还有三个版块,但当日没有发贴,即在posts表中当日没有记录,则这个查询就没有将其包含进来.
我的需求是,按照上面的查询时,同时也能将没有贴子的版块[count(p.id)为0]也一并查询出来.查了一些资料,将上面的left join 改成right join,left outer join,但都不管用!哪位能够帮帮我?谢谢!

解决方案 »

  1.   

    那你就先查forum表
    select * from forum left join (select id,name,count(id) from posts) as t on forum.....
      

  2.   

    yangxiao_jiang(只会google上能找到的),按你说有思路,果然可以,谢谢!zjh_2088,我早这样试过,没用的,呵呵.现把我的sql写出来
    select f.id,f.name,p.posts_num from forum as f left join 
    (select id,forum_id,count(id) as posts_num from posts where postat='20070801'
     group by forum_id) as p on (p.forum_id=f.id)
    where (.....)
    order by p.posts_num desc出来这样的结果:id      name         posts_num
    1 谈天说地    34
    3 衣食住行    31
    2 互通有无    26
    9 收藏天地    11
    5 游山玩水    9
    8        体育天地    NULL
    4        XXXXXXX     NULL
      

  3.   

    用union合并两个结果集,参考一下select * from(select forum.id, forum.name,report.total from forum, report
    where forum.id=report.id
    order by total desc)as A
    union all
    select * from (select forum.id, forum.name,0 from forum
    where  forum.id not in(select id from report) 
    )as B