请考虑以下事项:
Table - id, parentid
我想做的是,我想拉一个特定父母的所有孩子(不仅是直接的孩子,而且还有所有孩子,即孩子的孩子等)。
因此,假设该表包含以下行:(2, 1), (3, 1), (4, 2), (5, 4)
然后对于parentid = 1,该表将返回ID 2,3,4和5。
这可能吗?
如果没有(我想这确实不可能),我的选择是什么?
我真的不想使用几十个查询...
P.S。我无法改变数据库结构。
此外,由于表中可能有数十万条记录,我可以将它们全部拉出来并使用PHP来完成整个事情。
答案 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;
这种方法确实有一个固定的深度限制。我从我自己的数据中得知,它恰好跨越了最多五个层次的深度。如果深度相当稳定,您可以通过简单地添加更多左连接来适应一些增长。此外,不确定查询将如何执行数十万条记录。