我的架构旨在处理产品尺寸,因此产品属于一个项目,具有特定尺寸的项目就是一个产品。
我需要选择所有类别并计算其中的活跃产品数量 (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/