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

标签 mysql hierarchical-data

我有什么:

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

产品表。专栏category_idcategory.id : enter image description here

我正在尝试做的事情:

我正在尝试设计一个查询,该查询将对指定 lft 的类别产品进行计数和 rgt值(value)观。
例如:lft 之间= 2rgt = 11有 3 个“直接子类别”,其 ID 为 3 , 45 .看到wireless不包括子类别,因为它不是 lft 范围内的直接子类别和 rgt但此子类别的产品将被算作其直接子类别的一部分,即 headphone如下图所示。 Headphone有一个直接产品和另一个产品与其相关wireless子类别。

结果应该是:

enter image description here

我已设法进行查询以检索指定 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 时检索子目录,如最后一张图片所示。 = 2rgt = 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/

相关文章:

mysql - 如何使用 Python 查询 MySQL 中两列的日期范围

mysql - 合并 MYSQL 和 Postgresql

mysql - 在 MySQL 过程中处理树

.net - 使用 LINQ 选择分层数据?

c# - 将项目列表转换为树的通用方法

php - 无法从 php 中的 JSON 文件获取内容

mysql - Angular + NodeJS + mySQL 如何设置?

sql - MySQL:使用 IN 和 ORDER BY 时避免文件排序

sql - 从mysql自连接中检索父值

java - Java 或 SQL 中的树遍历函数