php - 如何从存在重复节点名称的嵌套集表中获取每个节点的深度

标签 php sql database tree

我试图对过去的帖子发表评论,但因为没有足够的代表而被禁止 :(

我正在寻求帮助,将我修改过的预序树遍历表变成一个

<ul> <li> 

使用 PHP 的菜单。

我看过这个:

Getting a modified preorder tree traversal model (nested set) into a <ul>

..它几乎回答了我需要知道的所有问题.. 除了一个问题。我表中的项目并非都是唯一命名的,因为相同的菜单项可以出现在不同的父级下(在这种情况下,不同“类型”文档下的相同部门名称。-所以当我运行 SQL 代码时:

SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM menu AS node
CROSS JOIN menu AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft

'Admin',这是一个使用了两次的菜单名称的例子,将它的'深度'级别加在一起(3 和 2)并显示为 5.. 这当然会弄乱它的定位并且只显示一次在创建菜单时。

这是我的 SQL 表:

CREATE TABLE `menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`lft` int(11) NOT NULL,
`rgt` int(11) NOT NULL,
PRIMARY KEY (`id`),
)

INSERT INTO `menu` (`id`, `name`, `lft`, `rgt`) VALUES
(21, 'root', 1, 30),
(39, 'Forms', 2, 11),
(40, 'Admin', 3, 6),
(56, 'Domcare', 7, 8),
(58, 'MIS', 9, 10),
(59, 'Documents', 12, 21),
(60, 'Residential', 15, 20),
(61, 'Guides', 22, 29),
(62, 'Hardware', 23, 28),
(63, 'Hosting', 24, 25),
(64, 'Installation', 26, 27),
(65, 'Absence', 4, 5),
(67, 'Admin', 13, 14);

如有任何帮助,我们将不胜感激!

最佳答案

您可以GROUP BY唯一ID:

SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM menu AS node
CROSS JOIN menu AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.id
ORDER BY node.lft

在这里查看我的 fiddle :SQL Fiddle

关于php - 如何从存在重复节点名称的嵌套集表中获取每个节点的深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21191081/

相关文章:

sql - 值得去规范化我们的数据吗?

php - mysql 计算唯一的单元格组合,空

php - 获取数据库结果后从数组中删除最后一个逗号

database - 从 sqlite3 迁移到 postgresql on Rails 3?

javascript - Cckeditor 从数据库加载模板

php - 在 PHP 中使用 PDO 在 SQLite 和 MySQL 之间执行 JOIN?

php - 使用 CodeIgniters Active Record 库来操作 MySQL 数据库是个好主意还是我应该只使用 SQL?

PHP合并连续的换行符数量并在必要时减少它?

php - 在 2 个不同的数据库中使用 2 个相等的字段 PHP

c# - 与 SQLite Dapper 的多个连接