从MySQL数据库递归获取所有子级

时间:2018-06-23 07:52:49

标签: python mysql

DataRow match = myData.AsEnumerable().FirstOrDefault(x => x["ID"] == textBox1.Text);
if (match != null)
    //Here's your row
else
    //No match found

如果我有一个ID,并且想获取其子代,则可以运行以下查询:

+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| subject      | int(11)      | YES  |     | NULL    |       |
| relationship | varchar(266) | YES  |     | NULL    |       |
| target       | int(11)      | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+

这将使我的所有孩子都受益于“ is_a”关系。然后,我想找到所有这些孩子的孩子。我要继续下去,直到没有更多的孩子为止。最后,我想要一个源于我的原始根ID的子ID列表。

是否有一种有效的方法来做到这一点?我尝试使用python脚本以递归方式在上面运行该查询,并且需要几分钟才能生成约100个结果。

注意:一个孩子可能有多个父母

1 个答案:

答案 0 :(得分:0)

将树结构存储在关系数据库中的一种聪明方法是使用嵌套集。

假设我们有以下树:

    1
   / \
  2   3
 /    /\
4    5  6

我们有一个传统的parent_id:

| id | parent_id |
|----+-----------|
|  1 | 0         |
|  2 | 1         |
|  3 | 1         |
|  4 | 2         |
|  5 | 3         |
|  6 | 3         |

在此模型中,您没有机会,而是递归获取某个节点的所有后代。

现在,我们为每个节点添加2个数字:左右。

左边的数字小于节点的所有子代的数目,而右边的数字大于节点的所有子代的数目。

我将这些数字放在方括号中

    (1)     1        (12)
       /            \
 (2)  2 (5)    (6)   3 (11)
     /           /        \
(3) 4 (4)   (7) 5 (8)  (9) 6 (10)

然后我们得到下表:

| id | parent_id | left | right |
|----+-----------+------+-------|
|  1 |         0 |    1 |    12 |
|  2 |         1 |    2 |     5 |
|  3 |         1 |    6 |    11 |
|  4 |         2 |    3 |     4 |
|  5 |         3 |    7 |     8 |
|  6 |         3 |    9 |    10 |

现在,您可以使用2个查询来获取节点的所有子节点:首先,您将节点向左移,将节点向右移,然后:

SELECT
    id
FROM
    tbl
WHERE
    `left` > $node_left
AND
    `right` < $node_left

这种方法要求您在修改树的结构时重新计算左右。