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

Ciclo ricorsivo MySql sql

Il mio trucco farovite per gestire i dati strutturati ad albero nel database è aggiungere una colonna FullID alla tabella per evitare SQL/procedure memorizzate complesse (forse ricorsive).

FullID     id  parent   name
-----------------------------
1          1   null     root1
2          2   null     root2
2.3        3   2        home
2.3.4      4   3        child
2.3.4.5    5   4        sub_child
2.3.4.5.6  6   5        sub_sub_child

Quindi, per trovare l'ID della pagina principale, estrai la prima parte di FullID tramite SQL o il linguaggio dell'applicazione.

Se si utilizza SQL, è possibile utilizzare il seguente SQL per ottenere l'ID root.

-- MySQL dialect
select substring_index(FullID,'.',1) as RootID from table;

-- SQL Server dialect
select case charindex('.', FullID) when 0 then FullID else substring(FullID, 1, charindex('.', FullID)-1) end as RootID from table

Per eliminare un nodo e i suoi figli

DELETE table WHERE id=<CURRENT_NODE_ID> OR FullID LIKE '<CURREN_NODE_FULLID>.%'

Per spostare un nodo e i suoi figli

-- change the parent of current node:
UPDATE table
SET parent=<NEW_PARENT_ID>
WHERE id=<CURRENT_NODE_ID>

-- update it's FullID and all children's FullID:
UPDATE table
SET FullID=REPLACE(FullID,<CURRENT_NODE_PARENT_FULLID>, <NEW_PARENT_FULLID>)
WHERE (id=<CURRENT_NODE_ID> OR FullID LIKE '<CURRENT_NODE_FULLID>.%')

Nota

Questo trucco viene applicato solo su casi limitati a livello di albero o su FullID non può contenere contenuti lunghi se il livello dell'albero è troppo profondo.