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

MySQL - È possibile ottenere tutti gli elementi secondari in una gerarchia?

Questo è semplicemente un Modello di adiacenza tavolo? Quindi non è possibile in una query senza conoscere la profondità massima.

Uno spunto di riflessione è Gestire i dati gerarchici in MySQL (sebbene io non sostenga l'utilizzo del Modello di set nidificato per dati che si alterano regolarmente).

Con molti join (a sinistra), più precisamente:con tanti join a sinistra quanto la profondità massima dell'albero, sarà possibile in una query. Questo è il motivo per cui molte persone tendono a salvare la "profondità" di una categoria specifica, quindi sarai in grado di filtrare e limitare la quantità di join allo stesso tavolo a un importo più ragionevole.

Personalmente, per alterare regolarmente i dati:tendo a configurare un trigger su un inserimento/aggiornamento, che salverà/memorizzerà nella cache il "percorso" corrente di un nodo basato sugli ID (ad esempio:un percorso è "12/62/28/345 ', in cui ogni passaggio tra il delimitatore / è la chiave primaria di un nodo genitore nell'ordine corretto (il genitore di 345 è 28, il genitore di 28 è 62, ecc.)), quindi posso interrogarlo con un solo join come questo (/ usato come separatore):

SELECT j.*
FROM tablename o
JOIN tablename j
WHERE j.path LIKE CONCAT (o.path,'/%')
AND  j.id != o.id  -- skip parent asked for.
WHERE o.id = <the id of the node you're looking for>;