mysql - 统计某个类别内的所有活跃产品;左连接未按预期工作

标签 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

如何得出预期结果?

最佳答案

左连接中第二个表的条件属于 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;

关于mysql - 统计某个类别内的所有活跃产品;左连接未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47633584/

相关文章:

mysql - MySQL 中何时使用单引号、双引号和反引号

php - php上线 fatal error : Call to a member function execute() on a non-object in/public_html/website/index.

php - mysql_num_rows() 期望参数 1 是资源,在中给出的 bool 值

php - Laravel 4 2个表之间的连接

sql - 通过在 SSIS 中运行 excel VBA 宏来自动化流程

php - 按左连接中的数据分组

SQL 报表服务器 URL 增长失控(ExecId 和 PingId)

mysql - 使用 Powershell 查询大型 MySQL 表并存储在变量中的最佳策略

php - 数据库分组需要所有其他列

mysql - DELETE JOIN 出现问题