两个表上的计数(*)

时间:2014-05-13 14:15:21

标签: mysql sql

我很少接受这个SQL查询。我有两张桌子

TbleName - usrs                     TbleName - idtb

name  |  cid                      cname   |   cid
-------------                     ----------------
james |  1100                      IT     |   1100
john  |  1200                      HR     |   1300
jack  |  1100                      QA     |   1200
bill  |  1300                      HD     |   1400
troy  |  1100


SELECT COUNT(*) as 'Total' FROM usrs u WHERE u.cid = 1100;

SELECT c.cname FROM idtb c WHERE c.cid = 1100;

我的第一个查询返回3,我的第二个查询返回IT,现在我想将这2个查询加入一个可以产生结果的查询

        Total   |   Cname
        ------------------
          3     |    IT

我尝试了几种方法,这有效

    SELECT COUNT(*) as 'Total',c.cname FROM usrs u JOIN  
    idtb c ON u.cid = c.cid WHERE u.cid = 1100
    GROUP BY u.cid 

但是当u.cid = 1400时,查询似乎不起作用,因为usrs表中没有cid值为1400的名称,并且它返回空结果,但我希望结果为

        Total   |   Cname
        -------------------
          0     |    HD

如果usrs中没有记录,则查询不起作用。我尝试使用左,右和完全连接,但没有想出来。任何帮助是极大的赞赏。

8 个答案:

答案 0 :(得分:3)

由于您要打印所有cname但计算usrs,这是您需要的查询:

select a.cname, count(b.name)
  from idtb a left join usrs b on (a.cid = b.cid)
 group by a.cname

如果您想为其中一些添加过滤器,只需添加where子句。

在这里查看小提琴:http://sqlfiddle.com/#!2/0acec/2

答案 1 :(得分:2)

SELECT COUNT(*) as 'Total', idtb.cname
FROM idtb LEFT JOIN usrs
ON usrs.cid=idtb.cid
WHERE usrs.cid=1100
GROUP BY idtb.cname

答案 2 :(得分:1)

此查询将起作用

   SELECT COUNT(u.cid) as 'Total',c.cname 
   FROM usrs u left JOIN  
    idtb c ON u.cid = c.cid and u.cid = 1100
    GROUP BY u.cid 

答案 3 :(得分:0)

试试这个。

SELECT i.cname, count(u.name) AS 'Total' 
  FROM idtb i LEFT JOIN usrs u ON (i.cid = u.cid)
 GROUP BY 1; 

COUNT(1)比*

更有效

我希望它适合你。

答案 4 :(得分:0)

这应该可以解决问题

    SELECT COUNT(*) as 'Total', c.cname 
    FROM idtb c 
    LEFT JOIN users u
    ON u.cid = c.cid 
    GROUP BY u.cid 

答案 5 :(得分:0)

SELECT COUNT(u.cid) as 'Total'
     , c.cname 
FROM usrs u 
RIGHT JOIN
idtb c 
    ON u.cid = c.cid 
WHERE c.cid = 1100
GROUP BY c.cname

答案 6 :(得分:0)

有几种方法可以做到这一点。最简单的可能是使用子查询:

SELECT 
  (SELECT COUNT(1) FROM usrs WHERE cid = 1100) as Total,
  cname 
FROM 
  idtb c 
WHERE 
  c.cd = 1100;

答案 7 :(得分:0)

mysql将允许您在选择列表中使用整个子查询,只要子查询生成scalar value(子查询必须只返回1列,并且只返回1行)。

select (SELECT COUNT(*) as 'Total' FROM usrs u WHERE u.cid = 1100)
     , (SELECT c.cname FROM idtb c WHERE c.cid = 1100)