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项的类别的原因是,联接表示“仅从右输入返回左/右值位于左输入中任何行之间的行”。左/右值之间没有任何值的任何内容都将被联接过滤掉
希望这有助于解释它看看<