我有一个层次结构系统设置程序,用于在数据库中存储项目的级别和父ID。 我要弄清楚的是,如何找到用户选择的所有子行。 这是表结构的示例:

+----+---------+----------+-------+
| Id |  label  | parentid | level |
+----+---------+----------+-------+
|  1 | honda   |        0 |     1 |
|  2 | accord  |        1 |     2 |
|  3 | civic   |        1 |     2 |
|  4 | element |        1 |     2 |
|  5 | v4      |        2 |     3 |
|  6 | v6      |        2 |     3 |
+----+---------+----------+-------+

因此,如果有人删除honda ,我将如何删除层次结构中的所有内容? 数据库将只能降级到3级。

===============>>#1 票数:8 已采纳

参考, 带关系innoDB的递归MySQL查询

我昨天发布了同样的答案

更新:

以下是基于以上链接的function ,但已根据您的DELETE要求进行了量身定制

CREATE PROCEDURE `delete_relations`(`_id` INT)
BEGIN
DECLARE  delete_row_ids varchar(200);
DECLARE id, id2 varchar(200);
DECLARE rows_affected int;

SET delete_row_ids  = _id;
SET id              = _id;
SET id2             = id;

WHILE id2 IS NOT NULL DO 
    SET id = NULL;
    SELECT GROUP_CONCAT( hierarchical_data.id ), CONCAT( GROUP_CONCAT( hierarchical_data.ID ),',',delete_row_ids) INTO id, delete_row_ids FROM hierarchical_data WHERE FIND_IN_SET( parentid , id2 ) GROUP BY parentid ;
    SET id2 = id;
END WHILE;  

DELETE FROM hierarchical_data where FIND_IN_SET(hierarchical_data.id, delete_row_ids);
SELECT row_count() INTO rows_affected;

if rows_affected > 0 THEN
SELECT delete_row_ids as row_ids_deleted;
ELSE
SELECT 'NO_ROWS_DELETED';
END IF;

END//

SQLFiddle

采用

CALL delete_relations(1)

删除id = 1 honda所有条目及其关系

希望对您有所帮助

===============>>#2 票数:1

:id替换为以下要删除的根条目ID:

DELETE FROM table
WHERE
   id = :id 
   OR id IN (  
-- first level
SELECT DISTINCT id sid
FROM table
WHERE parentid = :id
-- second level
UNION
SELECT DISTINCT t2.id sid
FROM table t1
INNER JOIN table t2
ON t1.id = t2.parentid
WHERE t1.parentid = :id
-- third level
UNION
SELECT DISTINCT t3.id sid
FROM table t1
INNER JOIN table t2
ON t1.id = t2.parentid
INNER JOIN table t3
ON t2.id = t3.parentid
WHERE t1.id = :id
)

请注意,您有3个级别,但是根节点占据了其中一个级别,这意味着您实际上只需要选择子级和孙级。 上面的查询会再执行一个级别(第3个级别),因此您可以将第-- third level之后的部分删除到右括号。

===============>>#3 票数:1

假设您使用的是具有触发器的MySQL 5,则可以在删除触发器之前编写一个小的触发器,以轻松实现此目的。 我没有完全检查语法,但是将与以下内容大致匹配:

CREATE TRIGGER tr_tablename_bd BEFORE DELETE ON tablename
  FOR EACH ROW BEGIN
    DELETE FROM tablename WHERE parentID = deleted.id
END;

上面的代码还将适用于无限级别,而不仅仅是3个级别。 您将需要删除一行,触发器将删除以下级别的数据行或将已删除的行标记为parentID的行。

但是,我隐约记得MySQL的一个问题,即它无法启动级联触发器。 意味着MySQL由于触发另一个触发器而未能触发触发器。 如果您正在使用的MySQL版本(甚至最新版本)中仍然存在该错误,则此代码将不起作用。 但是,从理论上讲,这是完全可以的,并且可以在肯定有触发器的所有其他数据库上工作。 对于MySQL,您只需要检查他们是否能够解决该错误!

  ask by ssergei translate from so

未解决问题?本站智能推荐:

1回复

如何在mysql表中查找行的位置? [重复]

这个问题已经在这里有了答案: MySQL-在选择的 4个答案 上获取行号 是否有可能在mysql表中找到行的位置? 例如,如果我们有mysql查询 这将选择X之后创建的所有行,并相对于它们的创建日期进行排列。现在,如果我知道这些行ID中的一个,是否可以
1回复

如何在MySQL中查找所有相关的表

这个问题已经在这里有了答案: 如何找到所有mysql表之间的所有关系? 8个答案 如何在MySQL中查找表的所有关系。 无论是引用某个表还是引用其他表。 例如,假设student是一个包含id (primary key) , name , class(Fo
5回复

如何使用MySQL查询从DB中的所有行中查找类似的结果

我想在facebook中制作“Search your LOGIN”: 例如。 搜索“股票溢出”将返回 例如。 搜索“LO”将返回: 例如。 搜索用户名“user123”将返回: 我的数据库行: 我想做一个搜索输入,搜索上面任何一行中的单词,如上例所示,
4回复

如何在php mysql中获取结果的所有行?

在我的表中,我有2条记录,其中companyid = 1 ,但当我运行下面的php为companyid = 1它只返回第一个! 我怎样才能获取所有记录? php文件: 使用mysql_fetch_array也是如此。 它返回{"product":[{"pid":"12371"
1回复

如何在php和mysql中为每一行创建唯一的子页面?

我有一个包含4列的表格(ID,名称,姓氏,URL)。 我想为每一行创建唯一的子页面。 (example.com/id?=444)。 因此,如果我访问example.com?id=444,我将看到ID为444的行中的数据。 现在,我有了表单,可以在其中向数据库添加数据: 现在,
1回复

如何在MySQL中解决“无法添加或更新子行”?

我已经编写了一个PHP脚本来与MySQL数据库进行交互。 它已经接近完成,但是我在处理外键约束时遇到了一个错误。 我有一个自包含的函数,应该完成一个MySQL事务: 运行此代码时,将返回以下错误: 我相信在$query2插入datetime值可能会出现轻微的语法问题,我真
3回复

如何在MySQL中查找具有数字字段的相似行?

我有一个存储歌曲信息的数据库。 这些信息是: 歌曲的响度介于-100和100之间, 歌曲的能量介于0和1之间 歌曲的速度在0到500之间, 歌曲的可跳舞性,介于0和1之间 我需要找到两首相似的歌曲。 例如: 一首歌有类似的信息 响度:-9.1210
3回复

PHP + MySQL:在某些字段中查找包含字符串“ ABC”的所有行

我对这个东西还比较陌生,所以请原谅如果问题是转储。 假设一个表包含以下字段:id,str_field。 str_field的值类似于“ 12:17:1246:90”。 我想获取str_field包含例如“ 17”的所有行。 为此,我需要执行以下命令 如果表中有很多行,查询可能会很
1回复

如何在MySQL中检索两个日期之间的所有行? [重复]

这个问题已经在这里有了答案: 在MySQL中搜索日期范围的最有效方法是什么? 1个答案 我有一个问题,希望得到答案。 现在我想根据特定日期从数据库中检索一些数据。 所以我在数据库中有一个表,称为航班。 该表在其中存储了一些航班数据。 我编写了一
7回复

如何在MySQL数据库中查找与其他行没有正确关联的行

我的MySQL数据库中有一个表,部分看起来像这样: 它们的重要特征是所有条目都是成对的,因此每个“所有者”也由它们关联的记录“拥有”。 A“拥有” B,并且B“拥有”A。D“拥有” C,也C“拥有”D。 但是,在第5行中,我们有一个问题。 E“拥有” X,但是没有X“拥有” E