(二)如何在MySQL中使用“嵌套集模型“管理分层数据

本文介绍了如何在MySQL中使用嵌套集模型来管理分层数据,包括添加新节点、删除节点以及查询树结构。讨论了不同场景下的节点操作,如在已有子节点的父节点间添加节点、在无子节点的父节点下添加子节点,以及删除叶节点和有子节点的节点。此外,提到了Joe Celko的相关著作作为深入学习的资源。

接上一章节

如果你不希望显示父节点,将HAVING depth <= 1行改为 HAVING depth = 1。

嵌套集合中的聚集函数
让我们添加一个产品表,可用于演示汇总功能:

CREATE TABLE product
(
  product_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(40),
  category_id INT NOT NULL
);

INSERT INTO product(name, category_id) VALUES('20" TV',3),('36" TV',3),
('Super-LCD 42"',4),('Ultra-Plasma 62"',5),('Value Plasma 38"',5),
('Power-MP3 5gb',7),('Super-Player 1gb',8),('Porta CD',9),('CD To go!',9),
('Family Talk 360',10);

SELECT * FROM product;

+------------+-------------------+-------------+
| product_id | name              | category_id |
+------------+-------------------+-------------+
|          1 | 20" TV            |           3 |
|          2 | 36" TV            |           3 |
|          3 | Super-LCD 42"     |           4 |
|          4 | Ultra-Plasma 62"  |           5 |
|          5 | Value Plasma 38"  |           5 |
|          6 | Power-MP3 128mb   |           7 |
|          7 | Super-Shuffle 1gb |           8 |
|          8 | Porta CD          |           9 |
|          9 | CD To go!         |           9 |
|         10 | Family Talk 360   |          10 |
+------------+-------------------+-------------+

现在,让我们生成一个查询,它可以检索我们的类别树,以及每个类别的产品数:

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              
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值