如何使COUNT不计数(字段名)NULL值?

时间:2019-03-27 14:21:40

标签: mysql sql

我正在设置电子商务后端的请求。 我有3个表:product(ID为索引),category(ID为索引)和product_category,它们绑定了前2个表,因为一个产品可以属于多个类别,并且一个类别可以包含多个产品。

请求是获取所有类别的列表,其中包含类别名称和该类别中产品的数量,包括零值(当类别中不包含任何产品时)。显示结果的最后2列。

不幸的是,COUNT(字段名)给了我1而不是0。

这是我的SQL请求:

  SELECT product_category.id_category AS pr_cat_cat_id,
         id_product                   AS pr_cat_pr_id,
         product.name                 AS productname,
         categories.id,
         categories.name,
         COUNT ('pr_cat_cat_id')      AS quantity
    FROM product
         LEFT JOIN product_category ON product_category.id_product = product.id
         RIGHT JOIN (SELECT * FROM category) AS categories
             ON categories.id = product_category.id_category
GROUP BY name
ORDER BY id ASC

并获得以下结果:

pr_cat_cat_id   pr_cat_pr_id    productname      id     name        quantity    
1               1               Product "Name1"  1      Category 1  2   
2               3               Product "Name 3" 2      Category 2  2   
NULL            NULL            NULL             3      Category 3  1   
NULL            NULL            NULL             4      Category 4  1   
NULL            NULL            NULL             5      Category 5  1   
NULL            NULL            NULL             6      Category 6  1   

我确实希望没有产品的类别的数量为零。

2 个答案:

答案 0 :(得分:2)

您正在计算一个常量字符串值,该值永远不会为NULL。正确使用引号。您在这里不需要它们:

COUNT(product_category.id_category) AS quantity

您不能为COUNT()使用别名。您需要参考原始列。

请注意,您的查询格式不正确。 select中唯一的东西应该是name和聚合函数。

答案 1 :(得分:0)

无法引用同一选择列表中的列别名。而是使用其原始列名称:

COUNT(product_category.id_category)

注意:单引号用于字符串文字,并且它们绝不能为空。