MySQL递归查找所有 parent

标签 mysql sql recursion relation

<分区>

我有以下表格:

Category
id INT
name VARCHAR

Category_parent
category_id INT
parent_id INT

在 Category_parent 中,我存储类别关系,并且两列都从类别表中获取 id。所以我可以确定什么是什么的父级。

可以有任意数量的世代,因此很难找到特定类别继承自的所有类别。

比如CAT10的parent是CAT5,CAT5的CAT3,CAT3的CAT1等等。此外,一个类别可能有任意数量的 parent 。 我只给出类别名称,我的查询应该返回该类别的所有祖先。

MySQL有解决此类问题的方法吗?我如何为此使用存储过程?

最佳答案

让我给你一个想法。创建一个从给定 ID 多次获取 parent_id 的函数,我们称之为生成。 Cat10 第 1 代将是 CAT5 第 2 代的父代将是 CAT3,依此类推。

DROP FUNCTION IF EXISTS getNameIdGeneration;
DELIMITER $$
CREATE FUNCTION getNameIdGeneration(idPar int, generationPar int)
  RETURNS VARCHAR(1000) READS SQL DATA
BEGIN
  DECLARE auxLoopVar INT default 0;
  DECLARE parentIdVar INT default idPar;  
  DECLARE nameVar VARCHAR(1000) default NULL;

  count_loop: LOOP    
    SELECT parent_id INTO parentIdVar FROM Category_parent WHERE Category_id = parentIdVar;
    SET auxLoopVar = auxLoopVar + 1;        
    IF auxLoopVar >= generationPar THEN
      LEAVE count_loop;
    END IF;    
  END LOOP;
  SELECT name INTO nameVar FROM Category WHERE id = parentIdVar;

  RETURN nameVar;
END;
$$
DELIMITER ;

如果您测试给定的功能,假设 CAT10 的 Category_Id = 10

select getNameIdGeneration(10, 2);

三类

现在您只需要一个表,其中包含您想知道其血统的 CAT 的 ID

MariaDB [mydatabase]> select * from test;
+-------------+------------+
| category_id | generation |
+-------------+------------+
|          10 |          1 |
|          10 |          2 |
|          10 |          3 |
+-------------+------------+

MariaDB [mydatabase]> select generation, getNameIdGeneration(category_id, generation) as Name from test;
+------------+------+
| generation | Name |
+------------+------+
|          1 | CAT5 |
|          2 | CAT3 |
|          3 | CAT1 |
+------------+------+
3 rows in set (0.00 sec)

关于MySQL递归查找所有 parent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23133000/

相关文章:

php - htmlspecialchars 是否足以防止对用单引号引起来的变量进行 SQL 注入(inject)?

mysql二级索引查询差异很大,innodb vs myisam

mysql - 使用 group by 函数 mysql 查找 MODE 而不是 MAX/AVG

Mysql - 备份部分数据

sql - 案例 : WHEN column1 IS NULL THEN write column2

mysql - SQL:获取每组出现频率最高的值

java - 判断字符串是否为十六进制数的递归方法 - Java

go - 如何编辑埋在递归结构中的数组

java - 打印二叉搜索树中序遍历

mysql - Excel,通过将唯一值移动到另一个工作表来删除重复项