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

đặt hàng phân cấp cây sql

Bằng cách thêm cột đường dẫn và trình kích hoạt, điều này có thể được thực hiện khá dễ dàng.

Đầu tiên, hãy thêm một cột varchar sẽ chứa đường dẫn từ gốc đến nút:

ALTER TABLE category ADD path VARCHAR(50) NULL;

Sau đó, thêm một trình kích hoạt tính toán đường dẫn trên insert:

(chỉ cần nối id mới với đường dẫn của cha mẹ)

CREATE TRIGGER set_path BEFORE INSERT ON category
  FOR EACH ROW SET NEW.path = 
  CONCAT(IFNULL((select path from category where id = NEW.parent_id), '0'), '.', New.id);

Sau đó, chỉ cần chọn đặt hàng theo đường dẫn:

SELECT name, path FROM category ORDER BY path;

Kết quả:

pizza         0.1
piperoni      0.1.4
cheese        0.1.5
extra cheese  0.1.5.7
vegetariana   0.1.6
burger        0.2
coffee        0.3

Xem fiddle .

Bằng cách này, chi phí bảo trì cũng là tối thiểu. Trường đường dẫn bị ẩn khi chèn và được tính toán thông qua trình kích hoạt. Việc xóa một nút không có chi phí chung, vì tất cả các nút con của nút cũng bị xóa. Vấn đề duy nhất là khi cập nhật parent_id của một nút; Chà, đừng làm vậy! :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi 2006:Máy chủ MySQL đã không còn sử dụng Python, Bottle Microframework và Apache

  2. Cách kết nối từ xa với cơ sở dữ liệu MySQL nằm trên máy chủ được chia sẻ của chúng tôi

  3. Lưu trữ các thực thể html trong cơ sở dữ liệu? Hoặc chuyển đổi khi truy xuất?

  4. Làm cách nào để xóa các hàng khỏi bảng tham gia (ManyToMany) trong Doctrine?

  5. lấy dữ liệu từ cơ sở dữ liệu mysql để sử dụng trong javascript