Заявката работи чрез итерация по t_list
таблица (последният ред). За всеки ред в тази таблица, подзаявката в SELECT
клаузата отправя повторна заявка към таблицата, търсейки дъщерното на текущия ред (WHERE parent = _parent
-- но _parent
е псевдоним за @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
с id
на първия елемент и максималния брой елементи за извличане, съответно. Моля, тествайте го тук
.
Моделирането на такава структура от данни с 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;