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的主要内容,如果未能解决你的问题,请参考以下文章