sql >> Base de Datos >  >> RDS >> Mysql

consulta mysql para lista enlazada

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;