sql >> Databasteknik >  >> RDS >> Mysql

MySql sql rekursiv loop

Mitt farovite trick för att hantera trädstrukturerad data i databasen är att lägga till en kolumn FullID till tabell för att undvika komplexa (kanske rekursiva) SQL:er/lagrade 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å för att hitta rotsidans ID, extrahera bara den första delen av FullID via SQL eller ditt applikationsspråk.

Om du använder SQL kan du använda följande SQL för att få root-id.

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

Att radera en nod och dess underordnade

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

För att flytta en nod och dess barn

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

Obs

Det här tricket tillämpas endast på begränsade fall på trädnivå, eller FullID kan inte hålla långt innehåll om trädnivån är för djup.



  1. Hur uppdaterar du flera fält från en annan tabell i mysql?

  2. Flera markörer i kapslade loopar i MySQL

  3. HEXTORAW() Funktion i Oracle

  4. Databasmodellering för en svag enhet