Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

consulta mysql para lista vinculada


A consulta funciona iterando sobre o t_list tabela (a última linha). Para cada linha nesta tabela, a subconsulta no SELECT cláusula consulta novamente a tabela, procurando pelo filho da linha atual (WHERE parent = _parent -- mas _parent é um alias para @r ). Em cada iteração, o id do filho é atribuído ao @r variável.

Para adicionar limites, essa variação deve 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;

Substitua @start e @limit com o id do primeiro item e o número máximo de itens a serem recuperados, respectivamente. Por favor teste aqui .

Modelar tal estrutura de dados com um RDBMS é provavelmente uma má ideia. Por que não usar apenas uma coluna "índice"? Obter a lista torna-se instantâneo:
SELECT * FROM list ORDER BY index_column ASC;

Talvez sua lista deva mudar com frequência, mas consultas como essa devem ser bastante rápidas, a menos que a lista fique muito grande:
-- 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;