La consulta funciona iterando sobre la t_list
tabla (la última línea). Para cada fila de esta tabla, la subconsulta en SELECT
La cláusula vuelve a consultar la tabla, buscando el elemento secundario de la fila actual (WHERE parent = _parent
-- pero _parent
es un alias para @r
). En cada iteración, el id
del niño está asignado al @r
variables.
Para agregar límites, esta variación debería funcionar:
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;
Reemplazar @start
y @limit
con el id
del primer elemento y el número máximo de elementos a recuperar, respectivamente. pruébalo aquí
.
Modelar una estructura de datos de este tipo con un RDBMS es probablemente una mala idea. ¿Por qué no usar simplemente una columna de "índice"? Obtener la lista se vuelve instantáneo:
SELECT * FROM list ORDER BY index_column ASC;
Tal vez su lista esté destinada a cambiar con frecuencia, pero las consultas como esta deberían ser bastante rápidas a menos que la lista crezca mucho:
-- 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;