计算类别中的所有有效产品;左联接无法正常工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算类别中的所有有效产品;左联接无法正常工作相关的知识,希望对你有一定的参考价值。

我的模式旨在处理产品尺寸,因此产品属于一个项目,而具有一定尺寸的项目就是一个产品。

我需要选择所有类别并计算其中的活动产品(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

我如何得出预期的结果?

答案

left join中第二个表上的条件属于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;

以上是关于计算类别中的所有有效产品;左联接无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤 EF Core 中的多对多联接

Access SQL 中的联接语句

MySQL如何使用仅用于计数的where子句计算左联接?

当字段中有尾随零时,使用联接的查询无法正常工作

数据库联接的知识点,易错点

SQL Server 2000 或 2005 中的联接