Mysql
 sql >> Base de données >  >> RDS >> Mysql

Boucle récursive MySQL SQL

Mon astuce farovite pour gérer les données structurées en arbre dans la base de données consiste à ajouter une colonne FullID à table pour éviter les SQL/procédures stockées complexes (parfois récursives).

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

Donc, pour trouver l'identifiant de la page racine, il suffit d'extraire la première partie de FullID via SQL ou le langage de votre application.

Si vous utilisez SQL, vous pouvez utiliser le SQL suivant pour obtenir l'identifiant racine.

-- 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

Pour supprimer un nœud et ses enfants

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

Pour déplacer un nœud et ses enfants

-- 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>.%')

Remarque

Cette astuce n'est appliquée que sur des cas limités au niveau de l'arborescence, ou le FullID ne peut pas contenir de contenu long si le niveau de l'arborescence est trop profond.