按类别计算类型项目组的隐藏产品

时间:2017-12-04 12:37:39

标签: mysql sql

我的架构旨在处理产品尺寸,因此产品属于某个商品,而具有特定尺寸的商品就是产品。

我需要选择所有类别并计算其中的活动产品(Products.IsHidden = false)。

这是我的架构;

CREATE TABLE CATEGORIES (
  CategoryId int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  Name varchar(255)
);

CREATE TABLE ITEMS (
  ItemId int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  CategoryId int NOT NULL,
  Name varchar(255),
  Description varchar(255),
  FOREIGN KEY (CategoryId) REFERENCES CATEGORIES(CategoryId)
);

CREATE TABLE SIZES (
  SizeId int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  Name varchar(255)
);

CREATE TABLE PRODUCTS (
  ProductId int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  ItemId int NOT NULL,
  SizeId int NOT NULL,
  Price float,
  Weight float,
  Stock int NOT NULL,
  Discount float NULL,
  CreatedAt DateTime,
  PictureLoc varchar(255),
  IsHidden boolean,
  FOREIGN KEY (SizeId) REFERENCES SIZES(SizeId),
  FOREIGN KEY (ItemId) REFERENCES ITEMS(ItemId)
);

这是我的代码(我的目标是计算一个类别中的所有活动产品); 假设我在A类中有2个有效产品(IsHidden = false)。

SELECT 
  CATEGORIES.CategoryId, 
  CATEGORIES.Name, 
  Count(PRODUCTS.ProductId) as ActiveProducts 
FROM CATEGORIES 
  LEFT JOIN ITEMS 
   ON CATEGORIES.CategoryId = ITEMS.CategoryId 
  LEFT JOIN PRODUCTS 
   ON ITEMS.ItemId = PRODUCTS.ItemId 
WHERE PRODUCTS.IsHidden = FALSE 
GROUP BY CATEGORIES.CategoryId

但此代码只返回1行。

CategoryId | Category Name | ActiveProducts
1          | A             | 2

结果中是否应显示产品数为0的其他类别? 我的预期结果是:

CategoryId | Category Name | ActiveProducts
1          | A             | 2
2          | B             | 0
3          | C             | 0

我如何提出我的预期结果?

1 个答案:

答案 0 :(得分:0)

on中第二个表的条件属于where子句,而不属于SELECT c.CategoryId, c.Name, Count(p.ProductId) as ActiveProducts FROM CATEGORIES c LEFT JOIN ITEMS i ON c.CategoryId = i.CategoryId LEFT JOIN PRODUCTS p ON i.ItemId = p.ItemId AND p.IsHidden = FALSE GROUP BY c.CategoryId; 子句:

{{1}}