我有什么:
按层次结构列出的类别表:
产品表。专栏category_id
指category.id
:
我正在尝试做的事情:
我正在尝试设计一个查询,该查询将对指定 lft
的类别产品进行计数和 rgt
值(value)观。
例如:lft
之间= 2
和 rgt
= 11
有 3 个“直接子类别”,其 ID 为 3
, 4
和 5
.看到wireless
不包括子类别,因为它不是 lft
范围内的直接子类别和 rgt
但此子类别的产品将被算作其直接子类别的一部分,即 headphone
如下图所示。 Headphone
有一个直接产品和另一个产品与其相关wireless
子类别。
结果应该是:
我已设法进行查询以检索指定 lft
中的直接子类别和 rgt
值。
SELECT node.name,node.id, (COUNT(parent.name) - 1) AS depth
FROM category AS node,
category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.lft BETWEEN {$lft} AND {$rgt}
GROUP BY node.name
HAVING depth = 1
ORDER BY node.lft
此查询将在 lft
时检索子目录,如最后一张图片所示。 = 2
和 rgt
= 11
但它缺少计数。
我已经尝试了很长一段时间才能使结果表正确,这就是我想出的,但不幸的是,由于某种我不知道的原因,它不能很好地工作。感谢您对此提供的任何帮助。
SELECT parent.name, COUNT(product.category_id)
FROM category AS node1 ,
product, (
SELECT node.name,node.id,node.lft,node.rgt, (COUNT(parent.name) - 1) AS depth
FROM category AS node,
category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.lft BETWEEN {$lft} AND {$rgt}
GROUP BY node.name
HAVING depth = 1
ORDER BY node.lft
) as parent
WHERE node1.lft BETWEEN parent.lft AND parent.rgt
AND node1.id = product.category_id
GROUP BY parent.lft
ORDER BY parent.lft
更新:我试图制作 SQL fiddle,但我得到了大量错误列表:
CREATE TABLE category
(
id int auto_increment primary key,
name varchar(20),
lft varchar(20),
rgt varchar(20)
);
INSERT INTO category
(name, lft,rgt)
VALUES
('ELECTRONICS','1','18'),
('TV & audio','2','11'),
('Home theater','3','4'),
('Blu-ray','5','6'),
('Headphone','7','10'),
('Wireless','8','9'),
('Gaming','12','17'),
('Game consoles','13','14'),
('Video games','15','16');
CREATE TABLE product
(
id int auto_increment primary key,
name varchar(20),
category_id varchar(20)
);
INSERT INTO product
(category_id, name)
VALUES
('4','Sony Blu-ray player'),
('5','Beats Solo HD'),
('6','Beats Solo HD wireless'),
('8','PlayStation'),
('8','Xbox');
最佳答案
它能比这样的东西更简单(?):
SELECT category.name, COALESCE(C.total,0) as products
FROM category
LEFT JOIN
(SELECT category_id, count(*) as total FROM product GROUP BY category_id) AS C
ON C.category_id = category.id
WHERE category.lft > @min_range AND category.rgt < @max_range
如果您忽略“噪音”,这只是类别表和每个类别的产品数量之间的左连接(保持类别没有产品)。
使用您的测试用例,它产生:
+--------------+----------+
| name | products |
+--------------+----------+
| Home theater | 0 |
| Blu-ray | 1 |
| Headphone | 1 |
| Wireless | 1 |
+--------------+----------+
4 rows in set (0.00 sec)
如您所见,它为 wireless 产生了一个结果,它没有出现在您的预期结果中,但根据我对您对问题描述的理解,它 < em>应该在那里。
关于mysql - 计算与分层类别列表关联的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18159947/