我在 SQL Server 中使用了一些代码,从另一个仅具有直接父/子关系的表生成闭包表,我可以对此运行非常简单的查询来确定沿袭。现在我需要在 mySQL 中完成所有这些操作,但我在递归查询生成闭包表时遇到了麻烦...
我原来的 SQL Server 查询是
WHILE @@ROWCOUNT>0
INSERT INTO [ClosureTable] ([Ancestor], [Descendent])
SELECT distinct [Parent],[tc].[Descendent]
FROM
[RelationshipTable]
INNER JOIN [ClosureTable] as tc
ON [Child]COLLATE DATABASE_DEFAULT =
[tc].[Ancestor]COLLATE DATABASE_DEFAULT
LEFT OUTER JOIN [ClosureTable] As tc2
ON [Parent]COLLATE DATABASE_DEFAULT =
[tc2].[Ancestor] COLLATE DATABASE_DEFAULT
AND [tc].[Descendent]COLLATE DATABASE_DEFAULT =
[tc2].[Descendent]COLLATE DATABASE_DEFAULT
我的第一个问题是找到 @@ROWCOUNT 的替代品...但也许 mySQL 中的递归查询完全不同?我还查看了Bill Karwin's presentation
PS。由于性能问题,我需要“COLLATE DATABASE_DEFAULT”。谢谢。
最佳答案
我知道这已经过时了,但我觉得您仍然需要为其他人提供答案,以下是我从标准邻接表生成闭包表的方法:
mysql_query('TRUNCATE fec_categories_relations');
function rebuild_tree($parent)
{
// get all children of this node
$result = mysql_query('SELECT c.categories_id, c.parent_id, cd.categories_name FROM fec_categories c
INNER JOIN fec_categories_description cd ON c.categories_id = cd.categories_id
WHERE c.parent_id = "'.$parent.'"
AND cd.language_id = 1
ORDER BY cd.categories_name');
// loop through
while ($row = mysql_fetch_array($result))
{
$update_sql = " INSERT fec_categories_relations (ancestor, descendant, length)
SELECT ancestor, {$row['categories_id']}, length+1
FROM fec_categories_relations
WHERE descendant = {$row['parent_id']}
UNION ALL SELECT {$row['categories_id']},{$row['categories_id']}, 0";
mysql_query($update_sql);
echo '<li>' . $update_sql . "</li>";
rebuild_tree($row['categories_id']);
}
}
rebuild_tree(0);
关于mySQL 传递闭包表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4242416/