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

Loop recursivo MySQL sql


Meu truque farovite para lidar com dados estruturados em árvore no banco de dados é adicionar uma coluna FullID à tabela para evitar SQLs/procedimentos armazenados complexos (talvez recursivos).
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

Então, para encontrar o id da página raiz, apenas extraia a primeira parte de FullID via SQL ou sua linguagem de aplicação.

Se estiver usando SQL, você pode usar o seguinte SQL para obter o ID de raiz.
-- 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

Para excluir um nó e seus filhos
DELETE table WHERE id=<CURRENT_NODE_ID> OR FullID LIKE '<CURREN_NODE_FULLID>.%'

Para mover um nó e seus filhos
-- 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>.%')

Observação

Este truque é aplicado apenas em casos limitados de nível de árvore, ou o FullID não pode conter conteúdo longo se o nível da árvore for muito profundo.