select l.name,count(t.id) as 'cid' from type1data t,login l 
where t.date between '2011-08-01' and '2011-08-31' and l.id=t.userid and 
t.userid in(select id from login where rule='work' and deptid=1) group by l.name order by 'cid'这是一个文章发布统计的sql语句,
但是上面这句,只能将发布过新闻的用户查询出来,
我希望能够将所有用户都查出来,没有发布过新闻的用户就显示0
数据库是Mysql

解决方案 »

  1.   

    虽然不知道你在说什么,不过可以试试如下语句:
    select l.name,count(t.id) as 'cid' 
    from login l left join type1data t
    on l.id=t.userid 
    where t.date between '2011-08-01' and '2011-08-31' and t.userid in(select id from login where rule='work' and deptid=1) 
    group by l.name
    order by 'cid'
      

  2.   

    贴建表及插入记录的SQL,及要求结果出来看看你的是内连接,改用LEFT JOIN、RIGHT JOIN试试
      

  3.   

    select l.name,count(t.id) as 'cid' from type1data t,login l  
    where t.date between '2011-08-01' and '2011-08-31' and l.id=t.userid and  
    t.userid in(select id from login where rule='work' and deptid=1) group by l.name order by 'cid'
    union allselect l.name, 0 as 'cid' 
    from type1data t,login l 

    这里语句是查询没有发布过新闻的用户。这样就能满足你的要求啦。不知道你内部的结构,只是用这个办法了
      

  4.   

    额..是我描述的不清楚...
    左连接也是不行啊...
    实际上是这样的..
    我的用户表里  有20个用户,
    现在我要对这20个用户的新闻发布数量进行排行统计,按照发布的数量,从多到少依次排行..
    但是我上面的sql语句,只能将发布过新闻的用户统计出来...
    可没有发布过的用户,就没有显示了....
    我希望的是..让没有发布过信息的用户也显示,只不过显示发布数量为0因为我还要统计另一个表的数据,也是要各个用户都统计出来,而且两个表统计后的数字还要相加...
    所以必须要把0的用户也显示出来,我好相加..不然没有,加都没法加...
      

  5.   

    贴建表及插入记录的SQL,及要求结果出来看看
      

  6.   

    两个表的sql代码如下DROP TABLE IF EXISTS `login`;
    CREATE TABLE `login` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) DEFAULT NULL,
      `pwd` varchar(20) DEFAULT NULL,
      `rule` varchar(10) DEFAULT NULL,
      `lanmus` varchar(50) DEFAULT NULL,
      `deptid` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=gbk;
    INSERT INTO login VALUES ('1', '直属支队宣传科', '123', 'master', '1,2,4,5,6,7,8,9,10,14,16,17,18', '1');
    INSERT INTO login VALUES ('2', '玉凯一大队', '123', 'work', '1,2,4,5,6,7,8,9,10,13,15,', '1');
    INSERT INTO login VALUES ('3', '玉凯二大队', '123', 'work', '1,2,4,5,6,7,8,9,10,13,15,', '1');
    INSERT INTO login VALUES ('4', 'admin', 'admin', 'master', '1,2,4,5,6,7,8,9,10,13,12,14,15,16,17,18,19,', '4');
    INSERT INTO login VALUES ('7', '贵遵一大队', '123', 'work', '1,2,4,5,6,7,8,9,10,13,15,', '1');DROP TABLE IF EXISTS `type1data`;
    CREATE TABLE `type1data` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `userid` int(11) NOT NULL DEFAULT '0',
      `date` varchar(20) NOT NULL DEFAULT '0000-00-00 00:00:00',
      `mediaName` varchar(40) DEFAULT NULL,
      `mediaGuige` varchar(20) DEFAULT NULL,
      `mediaType` varchar(20) DEFAULT NULL,
      `title` varchar(100) DEFAULT NULL,
      `ticai` varchar(30) DEFAULT NULL COMMENT '电视报纸广播网络',
      `banmian` varchar(50) DEFAULT NULL,
      `author` varchar(50) DEFAULT NULL,
      `imgstr` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=26 DEFAULT CHARSET=gbk;INSERT INTO type1data VALUES ('4', '2', '2011-08-03', 'bbs', '省级二类', '广播', 'testdata', 'tab', '111', 'easy', null);
    INSERT INTO type1data VALUES ('2', '2', '2011-08-03', '贵阳晚报', '地市级', '报纸', '测试数据', '新闻1', 'A4', '测试', null);
    INSERT INTO type1data VALUES ('3', '2', '2011-08-03', '测试', '中央二类', '报纸', '测试1', '测试2', '测试', '测试2', null);
      

  7.   

    mysql> select b.name,count(a.id) from type1data a right join login b on b.id=a.userid group by b.name order by 2 desc;
    +----------------+-------------+
    | name           | count(a.id) |
    +----------------+-------------+
    | 玉凯一大队       |           3 |
    | 直属支队宣传科   |           0 |
    | 玉凯二大队       |           0 |
    | 贵遵一大队       |           0 |
    | admin          |           0 |
    +----------------+-------------+
    5 rows in set (0.00 sec)
      

  8.   

    应该是
    3
    0
    0

    SELECT a.`name`,COUNT(b.id) FROM `login` a 
    LEFT JOIN type1data b ON a.`id`=b.`userid`
    WHERE a.`rule`='work' GROUP BY a.`name`;
      

  9.   

    奇怪了,我加了其他条件以后就又不能显示0发布的单位了,大家帮我看看代码select b.name,count(a.id) as 'cid' from type1data a right join login b on b.id=a.userid 
    where a.date between '2011-08-01' and '2011-08-31' 
    and a.userid in(select id from login where dept='work' and deptid=1) group by b.name order by 2 desc 
      

  10.   

    SELECT a.`name`,COUNT(b.id) FROM `login` a  
    LEFT JOIN (SELECT * FROM type1data WHERE DATE BETWEEN '2011-08-01' AND '2011-08-31') b ON a.`id`=b.`userid`
    WHERE a.`rule`='work' GROUP BY a.`name`;