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