Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Loop rekursif MySql sql

Trik farovite saya untuk menangani data terstruktur pohon di database adalah menambahkan kolom FullID ke tabel untuk menghindari SQL/Prosedur Tersimpan yang rumit (mungkin rekursif).

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

Jadi, untuk menemukan id halaman root, cukup ekstrak bagian pertama FullID melalui SQL atau bahasa aplikasi Anda.

Jika menggunakan SQL, Anda dapat menggunakan SQL berikut untuk mendapatkan id root.

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

Untuk menghapus simpul dan turunannya

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

Untuk memindahkan simpul dan turunannya

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

Catatan

Trik ini hanya diterapkan pada kasus tingkat pohon terbatas, atau FullID tidak dapat menampung konten yang panjang jika level pohon terlalu dalam.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana mencegah kerusakan found_rows terpilih pada kondisi balapan?

  2. NHibernate Lancar tidak dapat memuat MySql.Data dari GAC dalam mode debug pengujian

  3. Cara menggunakan bind_result() alih-alih get_result() di php

  4. Cadangkan database mysql dan unduh sebagai file

  5. Float atau desimal untuk harga?