Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Di chuyển nút trong cây Tập hợp lồng nhau

Đây là một giải pháp cho phép bạn di chuyển một nút đến bất kỳ vị trí nào trong cây chỉ với một tham số đầu vào duy nhất - vị trí bên trái mới (newpos) của nút.

Về cơ bản có ba nhóm:

  • Tạo không gian mới cho cây con.
  • Di chuyển cây con vào không gian này.
  • Xóa không gian cũ bị bỏ trống bởi cây con.

Trong psuedo-sql, nó trông như thế này:

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

Biến:distance là khoảng cách giữa các vị trí mới và cũ,:width là kích thước của cây con và:tmppos được sử dụng để theo dõi cây con được di chuyển trong quá trình cập nhật. Các biến này được định nghĩa là:

// 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;
}

Để có ví dụ về mã hoàn chỉnh, hãy xem blog của tôi tại

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

Nếu bạn thích giải pháp này, vui lòng bỏ phiếu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thay thế mẫu regex trong MySQL

  2. sử dụng mysql SUM () trong mệnh đề WHERE

  3. Tại sao SQLSTATE [HY000]:Lỗi chung?

  4. Chèn danh sách giá trị không khớp với danh sách cột:1136 Số cột không khớp với số giá trị

  5. Tạo bảng không thành công với Ràng buộc khóa nước ngoài được định dạng không chính xác