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

Pindahkan simpul di pohon Kumpulan Bersarang

Berikut adalah solusi yang memungkinkan Anda memindahkan simpul ke posisi mana pun di pohon hanya dengan satu parameter input - posisi kiri baru (pos baru) dari simpul.

Pada dasarnya ada tiga set:

  • Buat ruang baru untuk subpohon.
  • Pindahkan subpohon ke dalam ruang ini.
  • Hapus ruang lama yang dikosongkan oleh subpohon.

Di psuedo-sql, tampilannya seperti ini:

//
 *  -- create new space for subtree
 *  UPDATE tags SET lpos = lpos + :width WHERE lpos >= :newpos
 *  UPDATE tags SET rpos = rpos + :width WHERE rpos >= :newpos
 * 
 *  -- move subtree into new space
 *  UPDATE tags SET lpos = lpos + :distance, rpos = rpos + :distance
 *           WHERE lpos >= :tmppos AND rpos < :tmppos + :width
 * 
 *  -- remove old space vacated by subtree
 *  UPDATE tags SET lpos = lpos - :width WHERE lpos > :oldrpos
 *  UPDATE tags SET rpos = rpos - :width WHERE rpos > :oldrpos
 */

Variabel :distance adalah jarak antara posisi baru dan lama, :width adalah ukuran subpohon, dan :tmppos digunakan untuk melacak subpohon yang dipindahkan selama pembaruan. Variabel ini didefinisikan sebagai:

// calculate position adjustment variables
int width = node.getRpos() - node.getLpos() + 1;
int distance = newpos - node.getLpos();
int tmppos = node.getLpos();
        
// backwards movement must account for new space
if (distance < 0) {
    distance -= width;
    tmppos += width;
}

Untuk contoh kode lengkap, lihat blog saya di

https://rogerkeays.com/how -to-move-a-node-in-nested-sets-with-sql

Jika Anda menyukai solusi ini, beri suara tinggi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL - Pisahkan Data Menjadi Beberapa Baris

  2. Lihat definisi prosedur/fungsi tersimpan di MySQL

  3. Menggunakan ORDER BY dan GROUP BY bersama-sama

  4. Apa itu INDEKS SPASIAL dan kapan saya harus menggunakannya?

  5. Laravel:mendapatkan satu nilai dari kueri MySQL