计算与分层类别列表相关联的产品

时间:2013-08-10 08:04:32

标签: mysql hierarchical-data

我有什么:

按层次列出的类别表: category table

产品表。列category_id引用category.identer image description here

我要做的是:

我正在尝试设计一个查询,用于计算具有指定lftrgt值的catogries产品。
例如:在lft = 2rgt = 11之间有3个“直接子类别”,其ID为34和{ {1}}。请参阅5子类别未包括在内,因为它不是wirelesslft范围内的直接子类别,但此子类别的产品将被计为其直接子类别的一部分,即rgt,如下图所示。 headphone有一个直接产品,另一个产品与其Headphone子类别相关。

结果应该是:

enter image description here

我设法创建了一个查询,用于检索指定wirelesslft值内的直接子类别。

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 = lft2 = 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

1 个答案:

答案 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>应在那里。