我有什么:
按层次列出的类别表:
产品表。列category_id
引用category.id
:
我要做的是:
我正在尝试设计一个查询,用于计算具有指定lft
和rgt
值的catogries产品。
例如:在lft
= 2
和rgt
= 11
之间有3个“直接子类别”,其ID为3
,4
和{ {1}}。请参阅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
更新:我试图让SQL小提琴,但我收到了很多错误:
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
答案 0 :(得分:0)
它可能是如此简单(?)而不是像:
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)
如您所见,它会产生无线的结果,但预期的结果中没有显示结果,但根据我对您对问题的描述的理解,< em>应在那里。