sql >> Database >  >> RDS >> Mysql

MySql sql recursieve lus

Mijn farovite-truc om boomgestructureerde gegevens in de database te verwerken, is door een kolom toe te voegen FullID naar tabel om complexe (misschien recursieve) SQL's/opgeslagen procedures te vermijden.

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

Dus om de hoofdpagina-ID te vinden, extraheert u gewoon het eerste deel van FullID via SQL of uw toepassingstaal.

Als je SQL gebruikt, kun je de volgende SQL gebruiken om de root-ID te krijgen.

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

Een node en zijn onderliggende items verwijderen

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

Een knoop en zijn kinderen verplaatsen

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

Opmerking

Deze truc wordt alleen toegepast op beperkte gevallen op boomniveau, of de FullID kan geen lange inhoud bevatten als het boomniveau te diep is.



  1. Sequel Pro en MySQL-verbinding mislukt

  2. Hoe impliciete transacties werken in SQL Server

  3. MySQL-prestaties:enkele tafel of meerdere tabellen

  4. Hoe de implementatie van PostgreSQL-database te automatiseren