2016-02-29 27 views
0
类别

分类表查询次数,产品错误时

+----+------+ 
| id | name | 
+----+------+ 
| 1 | cat1 | 
| 2 | cat2 | 
| 3 | cat3 | 
+----+------+ 

产品表

+----+-------+--------+ 
| id | name | cat_id |  
+----+-------+--------+ 
| 1 | prod1 |  1 |  
| 2 | prod2 |  1 |  
| 3 | prod3 |  3 |  
| 4 | prod4 |  1 |  
| 5 | prod5 |  3 | 
| 6 | prod6 |  1 |  
+----+-------+--------+ 

这是我的查询:

SELECT c.id, c.name, count(p.cat_id) num 
    FROM categories c 
    INNER JOIN products p ON c.id = p.cat_id 
    GROUP BY p.cat_id 

这是结果:

+----+------+-------+  
| id | name | count |  
+----+------+-------+  
| 1 | cat1 |  4 |  
| 3 | cat3 |  2 | 
+----+------+-------+ 

错误现在显示计数猫= 2 如何解决得到这样的结果:

+----+------+-------+  
| id | name | count |  
+----+------+-------+  
| 1 | cat1 |  4 |  
| 2 | cat2 |  0 |  
| 3 | cat3 |  2 | 
+----+------+-------+ 

完整的示例在这里:http://sqlfiddle.com/#!9/f2cbb9/1

回答

4

我想,你只需要改变你的加入到左连接。

SELECT c.id, c.name, count(p.cat_id) num 
     FROM categories c 
     LEFT JOIN products p ON c.id = p.cat_id 
     GROUP BY p.cat_id 
0
SELECT c.id, c.name, count(p.cat_id) num 
     FROM categories c 
     LEFT JOIN products p ON c.id = p.cat_id 
     GROUP BY p.cat_id 
0

每一个答案是正确的,你将需要使用LEFT JOIN达到规定的结果。为了得到你所要求的确切结果,你需要做的是:

SELECT c.id, c.name, COUNT(p.cat_id) AS `count` 
FROM categories AS c 
LEFT JOIN products AS p ON c.id = p.cat_id 
GROUP BY p.cat_id 
ORDER BY c.id ASC 

SO question Boby referenced有你为什么不能使用INNER JOIN来实现你想要的结果了很好的解释。