Mysql 了解SQL查询以查找每个类别嵌套集模型的项目计数

Mysql 了解SQL查询以查找每个类别嵌套集模型的项目计数,mysql,sql,nested-sets,Mysql,Sql,Nested Sets,我一直在阅读并理解所有的查询,直到每个类别中的项目计数。我已经在这里粘贴了查询和结果 SELECT parent.name, COUNT(product.name) FROM nested_category AS node , nested_category AS parent, product WHERE node.lft BETWEEN parent.lft AND parent.rgt AND

我一直在阅读并理解所有的查询,直到每个类别中的项目计数。我已经在这里粘贴了查询和结果

    SELECT parent.name, COUNT(product.name)
    FROM nested_category AS node ,
            nested_category AS parent,
            product
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
            AND node.category_id = product.category_id
    GROUP BY parent.name
    ORDER BY node.lft;

    +----------------------+---------------------+
    | name                 | COUNT(product.name) |
    +----------------------+---------------------+
    | ELECTRONICS          |                  10 |
    | TELEVISIONS          |                   5 |
    | TUBE                 |                   2 |
    | LCD                  |                   1 |
    | PLASMA               |                   2 |
    | PORTABLE ELECTRONICS |                   5 |
    | MP3 PLAYERS          |                   2 |
    | FLASH                |                   1 |
    | CD PLAYERS           |                   2 |
    | 2 WAY RADIOS         |                   1 |
    +----------------------+---------------------+
到底发生了什么?嵌套的_类别表有两个副本,分别名为node和parent。在本例中,总共有10个项目,因此从
node.category\u id=product.category\u id
起,选择了10个“节点”。然后,每个节点至少存在一个父节点。但是我不理解查询的
计数(product.name)
部分。这如何为您提供每个类别的商品数量?我对sql不是很熟练


编辑:我在这段代码中发现了一个缺陷。它不会显示项目为零的类别,但是我也不完全理解。

看看
GROUP BY
子句-这解释了计数,我将运行它:

暂时忽略实际的SELECT,FROM子句的第一部分是左侧输入
nested_category
,别名为“parent”

然后将其自身连接到
嵌套的_类别
,作为右侧输入,并别名为
节点
,但该子句给出了右侧输入中在左侧输入左/右值之间具有左/右值的所有行:

您将得到如下结果(选择所有相关列):

注意如何多次获取父项(父项*子项数)

这将代表以下层次结构:

  1/10 + 
       |-> 2/3
       |-> 4/9 +
               |-> 5/6
               |-> 7/8
基本上,对于左输入中的每一行,您都会得到右输入中的所有子行

然后分组开始,
groupby
子句通过左手输入进行分组(
Parent.Name
这可能不是分组的最佳方式,除非
Parent.Name
是唯一的!),然后统计右手输入中的行数,因此在上面的情况下,它将为您提供

Parent ID 1 (item 1/10) = 4 rows
Parent ID 2 (item 4/9) = 2 rows
分组(或聚合)时,只能选择GROUP BY子句中出现的项目,否则必须使用聚合函数,如SUM、COUNT、AVG等

Edit:它不提供任何包含0项的类别的原因是,联接表示“仅从右输入返回左/右值位于左输入中任何行之间的行”。左/右值之间没有任何值的任何内容都将被联接过滤掉


希望这有助于解释它

看看
GROUP BY
子句-这解释了计数,我将运行它:

暂时忽略实际的SELECT,FROM子句的第一部分是左侧输入
nested_category
,别名为“parent”

然后将其自身连接到
嵌套的_类别
,作为右侧输入,并别名为
节点
,但该子句给出了右侧输入中在左侧输入左/右值之间具有左/右值的所有行:

您将得到如下结果(选择所有相关列):

注意如何多次获取父项(父项*子项数)

这将代表以下层次结构:

  1/10 + 
       |-> 2/3
       |-> 4/9 +
               |-> 5/6
               |-> 7/8
基本上,对于左输入中的每一行,您都会得到右输入中的所有子行

然后分组开始,
groupby
子句通过左手输入进行分组(
Parent.Name
这可能不是分组的最佳方式,除非
Parent.Name
是唯一的!),然后统计右手输入中的行数,因此在上面的情况下,它将为您提供

Parent ID 1 (item 1/10) = 4 rows
Parent ID 2 (item 4/9) = 2 rows
分组(或聚合)时,只能选择GROUP BY子句中出现的项目,否则必须使用聚合函数,如SUM、COUNT、AVG等

Edit:它不提供任何包含0项的类别的原因是,联接表示“仅从右输入返回左/右值位于左输入中任何行之间的行”。左/右值之间没有任何值的任何内容都将被联接过滤掉


希望这有助于解释它

看看
GROUP BY
子句-这解释了计数,我将运行它:

暂时忽略实际的SELECT,FROM子句的第一部分是左侧输入
nested_category
,别名为“parent”

然后将其自身连接到
嵌套的_类别
,作为右侧输入,并别名为
节点
,但该子句给出了右侧输入中在左侧输入左/右值之间具有左/右值的所有行:

您将得到如下结果(选择所有相关列):

注意如何多次获取父项(父项*子项数)

这将代表以下层次结构:

  1/10 + 
       |-> 2/3
       |-> 4/9 +
               |-> 5/6
               |-> 7/8
基本上,对于左输入中的每一行,您都会得到右输入中的所有子行

然后分组开始,
groupby
子句通过左手输入进行分组(
Parent.Name
这可能不是分组的最佳方式,除非
Parent.Name
是唯一的!),然后统计右手输入中的行数,因此在上面的情况下,它将为您提供

Parent ID 1 (item 1/10) = 4 rows
Parent ID 2 (item 4/9) = 2 rows
分组(或聚合)时,只能选择GROUP BY子句中出现的项目,否则必须使用聚合函数,如SUM、COUNT、AVG等

Edit:它不提供任何包含0项的类别的原因是,联接表示“仅从右输入返回左/右值位于左输入中任何行之间的行”。左/右值之间没有任何值的任何内容都将被联接过滤掉

希望这有助于解释它

看看<