Dotaz funguje tak, že se iteruje přes t_list
tabulka (poslední řádek). Pro každý řádek v této tabulce poddotaz v SELECT
klauzule se znovu dotazuje na tabulku a hledá podřízenou položku aktuálního řádku (WHERE parent = _parent
-- ale _parent
je alias pro @r
). Při každé iteraci id
dítěte je přiřazena k @r
proměnná.
Chcete-li přidat hranice, tato varianta by měla stačit:
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;
Nahraďte @start
a @limit
s id
první položky a maximální počet položek k načtení. Prosím otestujte to zde
.
Modelování takové datové struktury pomocí RDBMS je pravděpodobně úplně špatný nápad. Proč nepoužít pouze sloupec „index“? Získání seznamu se pak stane okamžitým:
SELECT * FROM list ORDER BY index_column ASC;
Možná se váš seznam má často měnit, ale dotazy jako tento by měly být poměrně rychlé, pokud se seznam opravdu nezvětší:
-- 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;