sql >> Databáze >  >> RDS >> Mysql

MySql sql rekurzivní smyčka

Můj farovite trik pro zpracování stromových strukturovaných dat v databázi je přidat sloupec FullID do tabulky, abyste se vyhnuli složitým (snad rekurzivním) SQL/Uloženým procedurám.

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

Chcete-li tedy zjistit ID kořenové stránky, stačí extrahovat první část FullID přes SQL nebo jazyk vaší aplikace.

Pokud používáte SQL, můžete k získání kořenového id použít následující SQL.

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

Chcete-li smazat uzel a jeho podřízené položky

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

Přesunutí uzlu a jeho potomků

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

Poznámka

Tento trik se aplikuje pouze na případy s omezenou úrovní stromu nebo FullID nemůže pojmout dlouhý obsah, pokud je úroveň stromu příliš hluboká.



  1. php POST formulář pro aktualizaci dynamické proměnné

  2. Kdy mám zavřít DatabaseHelper?

  3. MySQL 'user_id' ve kterém je klauzule nejednoznačný problém

  4. SQL:BETWEEN vs <=a>=