2014-05-13 39 views
0

Iam用这个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,我的第二个查询返回它,现在我想加入这个2个查询到一个会produe我造成,因为这

 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,因为有在的USR表没有名字有CID值作为1400的工作并返回空的结果,但我想结果为

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

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

+0

在usrs表中没有cid = 1400的记录。你为什么期望它返回一些不同于0的东西? – Aheho

+0

@Aheho它不返回结果,它甚至不返回Cname HD如果u.cid = 1400,它只是返回空行 – user3205479

+0

@ user3205479看到我的答案。 –

回答

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

+0

感谢它的工作:) – user3205479

+0

@ user3205479很高兴我可以帮助:) –

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)比*

我希望它为你工作更有效率。

+2

'COUNT(1)'不比COUNT(*)效率更高http://stackoverflow.com/q/1221559/2186023 – DrCopyPaste

+0

感谢您的评论。我一直在这个错误。 – fmgonzalez

+0

它不工作抱歉 – user3205479

0

这应该做的伎俩

SELECT COUNT(*) as 'Total', c.cname 
    FROM idtb c 
    LEFT JOIN users u 
    ON u.cid = c.cid 
    GROUP BY u.cid 
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 
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 
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 
0

有这样做的几种方法。最简单的可能会使用子查询:

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

MySQL将让你在选择列表中使用一个完整的子查询,只要子查询生成一个scalar value(子查询必须只返回一个栏,只有1行) 。

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