MySQL以递归方式查找所有父项

时间:2014-04-17 12:23:33

标签: mysql sql recursion relation

我有以下表格:

Category
id INT
name VARCHAR

Category_parent
category_id INT
parent_id INT

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

可以有任意代数,因此找到特定类别继承的所有类别有点困难。

例如,CAT10的父母是CAT5,CAT5的CAT3,CAT3的CAT1等等。此外,一个类别可能有任何数量的父母。 我只提供类别名称,我的查询应该返回该类别的所有祖先。

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

1 个答案:

答案 0 :(得分:0)

让我给你一个想法。创建一个函数,从给定的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);

CAT3

现在您只需要一个包含您想知道其血统的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)