php - 如何在MySQL中删除带有子级的多级菜单项?

标签 php mysql

我在 MySQL 中有无限级别的菜单结构,其中父元素和子元素通过列 p_id 连接:

+----+------+------+----------------+
| id | p_id | sort | name_en        |
+----+------+------+----------------+
|  1 |    0 |    1 | menu-1         |
|  2 |    0 |    2 | menu-2         |
|  3 |    0 |    6 | menu-3         |
|  4 |    2 |    3 | sub-menu-2-1   |
|  5 |    2 |    4 | sub-menu-2-2   |
|  6 |    5 |    5 | sub-menu-2-2-1 |
+----+------+------+----------------|

删除带有子菜单元素的根菜单元素的最佳实践是什么?

我可以通过 PHP 递归来实现它,但它会导致一些查询。

所以我需要找出是否有任何可能的方法可以通过一个 MySQL 查询来做到这一点。

最佳答案

既然你有name_en,你不能用它来删除行吗?例如,

DELETE FROM `table` WHERE `id` = 2 OR `name_en` LIKE 'sub-menu-2-%'

新方法:

您可以使用 Foreign Key有约束。我创建了你的表并将其命名为树列表,

CREATE TABLE  `treelist` (
  `item_id` int(10) unsigned NOT NULL auto_increment,
  `parent_id` int(10) unsigned default NULL,
  `name_en` varchar(40) NOT NULL,
  PRIMARY KEY  (`item_id`),
  KEY `FK_parent_id` (`parent_id`),
  CONSTRAINT `FK_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `treelist` (`item_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后我添加了一些测试数据,即您问题中的数据,

INSERT INTO `treelist` (`item_id`, `parent_id`, `name_en`) VALUES (NULL, NULL, 'Menu 1'), (NULL, NULL, 'Menu 2'), (NULL, NULL, 'Menu 3'), (NULL, 2, 'Sub Menu 2-1'), (NULL, 2, 'Sub Menu 2-2'), (NULL, 5, 'Sub Menu 2-2-1');

现在,例如,当您删除一行时

DELETE FROM `treelist` WHERE `item_id` = 2

它也会删除所有子代、孙子等。之后表格看起来像,

+----+------+----------------+ 
| id | p_id | name_en        |
+----+------+----------------+ 
|  1 | NULL | Menu 1         | 
|  3 | NULL | Menu 3         |
+----+------+----------------+

关于php - 如何在MySQL中删除带有子级的多级菜单项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233734/

相关文章:

php - 来自具有附加字段的实体的 Symfony 表单

python - 如何使用 python 2.7 将变量的值插入到 mysql 中?

php - 如何查询使用同一张表的共同好友?

php - Ubuntu 15.10。安装了php但浏览器下载页面而不是打开

javascript - javascript和php按位运算结果的区别

mysql - 使用命令行执行 MySQL 存储过程

mysql - 当所述列的值为 NULL 时,确认我在可空列上使用 JSON_extract 函数的 where 语句?

MYSQL 中的 PHP 数组选择

php - 将单选按钮的数据存储在 MySQL 数据库中

php - 在 php 文件中将 javascript 代码显示为字符串