以递归方式从MySQL数据库中获取结果

时间:2012-01-16 17:50:17

标签: mysql recursive-query

请考虑以下事项:

Table - id, parentid

我想做的是,我想拉一个特定父母的所有孩子(不仅是直接的孩子,而且还有所有孩子,即孩子的孩子等)。

因此,假设该表包含以下行:(2, 1), (3, 1), (4, 2), (5, 4)

然后对于parentid = 1,该表将返回ID 2,3,4和5。

这可能吗?

如果没有(我想这确实不可能),我的选择是什么?

我真的不想使用几十个查询...

P.S。我无法改变数据库结构。

此外,由于表中可能有数十万条记录,我可以将它们全部拉出来并使用PHP来完成整个事情。

3 个答案:

答案 0 :(得分:0)

不是一步到位。

我使用PHP在MySQL中进行了递归查询...循环访问一个级别,收集数据,修改查询以使用上次迭代中返回的结果,再次运行查询等等。

对于这种事情,Mysql不是很友好。 MSSQL,Oracle或PostgreSQL以单一查询格式支持它。

答案 1 :(得分:0)

这可能会有所帮助:

$parentId = 1; // the parent id
$arrAllChild = Array(); // array that will store all children
while (true) {
    $arrChild = Array(); // array for storing children in this iteration
    $q = 'SELECT `id` FROM `table` WHERE `parentid` IN (' . $parentId . ')';
    $rs = mysql_query ($q);
    while ($r = mysql_fetch_assoc($rs)) {
        $arrChild[] = $r['id'];
        $arrAllChild[] = $r['id'];
    }
    if (empty($arrChild)) { // break if no more children found
        break;
    }
    $parentId = implode(',', $arrChild); // generate comma-separated string of all children and execute the query again
}
print_r($arrAllChild);

你也可以使用递归来做到这一点,但我认为上面需要更少的迭代。

希望它有所帮助!

编辑 - 我忘了提到你可以在MySQL存储过程中实现相同的逻辑,除了你不能使用数组。您可能已经猜到了上面的示例在PHP中实现

答案 2 :(得分:0)

这是我刚才为类似问题写的一个查询:

select if(e.id is not null, e.id, if(d.id is not null, d.id, if(c.id is not null, c.id, if(b.id is not null, b.id, a.id)))) as ID
from groups a
left join groups b on b.parent = a.id
left join groups c on c.parent = b.id
left join groups d on d.parent = c.id
left join groups e on e.parent = d.id
where a.parent = SOMETOPLEVELPARENTIDHERE;

这种方法确实有一个固定的深度限制。我从我自己的数据中得知,它恰好跨越了最多五个层次的深度。如果深度相当稳定,您可以通过简单地添加更多左连接来适应一些增长。此外,不确定查询将如何执行数十万条记录。