MySQL 计数和 IFNULL

Posted

技术标签:

【中文标题】MySQL 计数和 IFNULL【英文标题】:MySQL COUNT and IFNULL 【发布时间】:2020-10-09 10:19:39 【问题描述】:

我有这样的表: SQLFIDDLE

我正在尝试计算每个类别中有多少产品

SELECT `category_id`, `category_name`, IFNULL(count(*),0) cat_stat 
FROM 
    `product_to_categories`
NATURAL JOIN 
    `categories`
GROUP BY `category_id`

除了 IFNULL 部分外,它几乎可以工作。 我收到:

+-------------+---------------+----------+
| category_id | category_name | cat_stat |
+-------------+---------------+----------+
| 1           | category1     | 5        |
+-------------+---------------+----------+
| 2           | category2     | 5        |
+-------------+---------------+----------+
| 3           | category3     | 6        |
+-------------+---------------+----------+
| 5           | category5     | 4        |
+-------------+---------------+----------+

但我也想得到空结果:

+-------------+---------------+----------+
| category_id | category_name | cat_stat |
+-------------+---------------+----------+
| 1           | category1     | 5        |
+-------------+---------------+----------+
| 2           | category2     | 5        |
+-------------+---------------+----------+
| 3           | category3     | 6        |
+-------------+---------------+----------+
| 4           | category4     | 0        |
+-------------+---------------+----------+
| 5           | category5     | 4        |
+-------------+---------------+----------+

谢谢!

【问题讨论】:

【参考方案1】:
    自然连接 == 自然内连接,而您需要外连接。 基表是categories,因此必须首先提及(NATURAL LEFT JOIN 取最左边表中常用列的值)。 您必须计算确定的列,而不是普通列或总行数(它们会给出 1,而不是 0)。
SELECT `category_id`, 
       `category_name`, 
       COUNT(`product_to_categories`.`category_id`) cat_stat 
FROM `categories`
NATURAL LEFT JOIN `product_to_categories`
GROUP BY `category_id`

【讨论】:

非常感谢,也感谢您的解释!很有用!【参考方案2】:

你可以从categories开始,然后带上left join的products映射表,最后聚合,从映射表中计数一列。

select category_id, c.category_name, count(pc.category_id) cat_stat 
from categories c
left join product_to_categories pc using(category_id)
group by category_id

不需要ifnull()count() 永远不会返回 null 值。

【讨论】:

以上是关于MySQL 计数和 IFNULL的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql中一起打印计数结果和表?

Mysql 性能和计数(*)

结合连接和计数的MySQL语句?

MySQL 自动递增和选择计数

MySQL:获取计数和平均值 [重复]

MySQL 计数和 IFNULL