Forespørgslen fungerer ved at iterere over t_list tabel (sidste linje). For hver række i denne tabel, underforespørgslen i SELECT klausul genforespørger tabellen og søger efter den aktuelle rækkes underordnede (WHERE parent = _parent -- men _parent er et alias for @r ). Ved hver iteration, barnets id er tildelt @r variabel.
For at tilføje grænser bør denne variation gøre det trick:
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;
Erstat @start og @limit med id af henholdsvis den første vare og det maksimale antal varer at hente. test det her
.
Modellering af en sådan datastruktur med et RDBMS er sandsynligvis en dårlig idé. Hvorfor ikke bare bruge en "indeks" kolonne? Hentning af listen bliver derefter øjeblikkeligt:
SELECT * FROM list ORDER BY index_column ASC;
Måske er det meningen, at din liste skal ændres ofte, men forespørgsler som denne burde være ret hurtige, medmindre listen bliver virkelig stor:
-- 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;