【问题标题】:MySQL COUNT and IFNULLMySQL 计数和 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        |
+-------------+---------------+----------+

谢谢!

【问题讨论】:

    标签: mysql sql count left-join


    【解决方案1】:
    1. 自然连接 == 自然内连接,而您需要外连接。
    2. 基表是categories,因此必须首先提及(NATURAL LEFT JOIN 取最左边表中常用列的值)。
    3. 您必须计算确定的列,而不是普通列或总行数(它们会给出 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 值。

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 2011-01-09
      • 1970-01-01
      • 2011-06-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      相关资源
      最近更新 更多