gpt4 book ai didi

mysql查询链表

转载 作者:可可西里 更新时间:2023-11-01 07:33:01 25 4
gpt4 key购买 nike

我正在使用一个实现了单链表(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 开始一样。它怎么知道什么时候到达列表的末尾并且应该停止?我试过了,它永远运行(可能是由于与前一个问题相关的不当使用)。

谢谢。

最佳答案

查询通过遍历 t_list 表(最后一行)来工作。对于该表中的每一行,SELECT 子句中的子查询重新查询该表,搜索当前行的子行(WHERE parent = _parent -- 但 _parent@r 的别名)。在每次迭代中, child 的 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 分别替换为第一个项目的 id 和要检索的最大项目数。请test it here .


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

SELECT * FROM list ORDER BY index_column ASC;

也许您的列表会经常更改,但除非列表变得非常大,否则像这样的查询应该相当快:

-- insert an element at position X 
UPDATE list SET index_column = index_column +1 WHERE index_column > X ORDER BY index_column DESC;
INSERT INTO list VALUE (some_value, X);

-- delete an element at position X
DELETE FROM list WHERE index_column = X;
UPDATE list SET index_column = index_column -1 WHERE index_column > X ORDER BY index_column ASC;

关于mysql查询链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17537043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com