mySQL 传递闭包表

标签 mysql closures recursive-query transitive-closure-table

我在 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/

相关文章:

php - 使用查询mysql(表wordpress)从字段meta_key获取一些字符串

mysql - mysql会保证二进制日志(bin log)原子地写入Table_map事件/Write_rows事件/Xid事件吗?

mysql - mysql中修剪后如何删除重复项?

sqlite - 使用sqlite递归计算出现次数

sql - 帮助递归 CTE 查询加入第二个表

mysql - 递归循环 - 父/子树

php - Mysql表显示不正确

javascript - JS - 如何使用 `this`在不同范围内引用同一个对象?

rust - 将闭包传递给需要 std::ops::Fn 的函数

javascript - JavaScript 中的作用域和闭包问题