Mysql
 sql >> Database >  >> RDS >> Mysql

query mysql per l'elenco collegato

La query funziona iterando su t_list tabella (l'ultima riga). Per ogni riga di questa tabella, la sottoquery in SELECT la clausola interroga nuovamente la tabella, cercando il figlio della riga corrente (WHERE parent = _parent -- ma _parent è un alias per @r ). Ad ogni iterazione, l'id del bambino è assegnato al @r variabile.

Per aggiungere limiti, questa variazione dovrebbe fare il trucco:

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;

Sostituisci @start e @limit con l'id rispettivamente del primo elemento e il numero massimo di elementi da recuperare. Si prega di testarlo qui .

Modellare una tale struttura di dati con un RDBMS è probabilmente una cattiva idea del tutto. Perché non utilizzare semplicemente una colonna "indice"? Ottenere l'elenco diventa quindi istantaneo:

SELECT * FROM list ORDER BY index_column ASC;

Forse il tuo elenco dovrebbe cambiare frequentemente, ma query come questa dovrebbero essere abbastanza veloci a meno che l'elenco non diventi molto 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;