mysql查询链表

时间:2013-07-08 22:29:06

标签: mysql sql linked-list

我正在使用已实现单链表(id,parent)的表。这个实现一直运行良好,除了最近性能已经变得无法忍受,因为我的列表变得越来越长,我一直在单独查询节点。

我找到了一个很有前途的博客,介绍如何在单个查询中查询。 http://explainextended.com/2009/03/25/sorting-lists/

SELECT  @r AS _parent,
        @r := (
        SELECT  id
        FROM    t_list
        WHERE   parent = _parent
        ) AS id
FROM    (
        SELECT  @r := 0
        ) vars,
        t_list

唯一的问题是我对MySQL的了解并不足以使用它。我的问题与我在博客评论中发布的问题相同。如何设置从哪个记录/节点开始?就像我想从示例表中的id 3开始一样。它是如何知道什么时候它到达列表的末尾并应该停止?我已经尝试过,它只是永远运行(可能是因为与前一个问题相关的使用不当)。

感谢。

1 个答案:

答案 0 :(得分:4)

查询通过迭代t_list表(最后一行)来工作。对于此表中的每一行,SELECT子句中的子查询重新查询表,搜索当前行的子项(WHERE parent = _parent - 但_parent是{的别名{1}})。在每次迭代时,孩子的@r被分配到id变量。

要添加边界,这种变化应该可以解决问题:

@r

SELECT * FROM ( SELECT @r AS _parent, @r := ( SELECT id FROM t_list WHERE ( @c = 0 AND _parent IS NULL AND parent IS NULL ) -- special case if the first item is the root OR (parent = _parent) ) AS id, @c := @c + 1 AS rank FROM ( SELECT @c := 0, @r := parent FROM t_list WHERE id = @start ) AS ini, ( SELECT id FROM t_list LIMIT @limit ) AS lim ) AS tmp WHERE id IS NOT NULL; @start替换为第一项的@limit,以及要检索的最大项目数。请test it here


使用RDBMS建模这样的数据结构可能完全是一个坏主意。为什么不使用“索引”列?然后获取列表即刻:

id

也许你的列表是经常更改的,但是这样的查询应该相当快,除非列表变得非常大:

SELECT * FROM list ORDER BY index_column ASC;