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

MySql sql rekursiv loop

Mit farovite trick til at håndtere træstrukturerede data i databasen er at tilføje en kolonne FullID til tabel for at undgå komplekse (måske rekursive) SQL'er/lagrede procedurer.

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
 

Så for at finde rodside-id'et skal du blot udpakke den første del af FullID via SQL eller dit applikationssprog.

Hvis du bruger SQL, kan du bruge følgende SQL til at få root-id'et.

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

For at slette en node og dens børn

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

For at flytte en node og dens børn

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

Bemærk

Dette trick anvendes kun på begrænsede tilfælde på træniveau eller FullID kan ikke holde langt indhold, hvis træniveauet er for dybt.



  1. Sådan opretter du array i PostgreSQL

  2. MySQL:Sådan indsætter du flere poster med samme ID autoincrement

  3. MySQL Zend Framework - SQLSTATE[42000]:Syntaksfejl eller adgangsovertrædelse:1064

  4. Hvordan kan jeg tildele værdi til en variabel ved hjælp af aggregatfunktion i mysql?