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

Truy xuất tất cả các bản ghi cha / con từ cơ sở dữ liệu trên Laravel (dữ liệu phân cấp)

Vì bạn đang thực hiện các hoạt động phân cấp, bạn nên sử dụng chiến lược để lưu và truy xuất dữ liệu này từ cơ sở dữ liệu của mình.

Một cách tiếp cận là sử dụng Mô hình tập hợp lồng nhau , điều đó có thể làm cho nó dễ dàng hơn. , điều đó cũng giải thích cách nó hoạt động và tôi trích dẫn:

Lý thuyết đằng sau, phiên bản TL; DR

Một cách dễ dàng để hình dung cách hoạt động của một tập hợp lồng nhau là nghĩ về một thực thể mẹ bao quanh tất cả các con của nó và cha mẹ của nó bao quanh nó, v.v. Vì vậy, cây này:

root
  |_ Child 1
    |_ Child 1.1
    |_ Child 1.2
  |_ Child 2
    |_ Child 2.1
    |_ Child 2.2

Có thể được hình dung như thế này:

 ___________________________________________________________________
|  Root                                                             |
|    ____________________________    ____________________________   |
|   |  Child 1                  |   |  Child 2                  |   |
|   |   __________   _________  |   |   __________   _________  |   |
|   |  |  C 1.1  |  |  C 1.2 |  |   |  |  C 2.1  |  |  C 2.2 |  |   |
1   2  3_________4  5________6  7   8  9_________10 11_______12 13  14
|   |___________________________|   |___________________________|   |
|___________________________________________________________________|

Các con số đại diện cho ranh giới bên trái và bên phải. Bảng sau đó có thể trông như thế này:

id | parent_id | lft  | rgt  | depth | data
 1 |           |    1 |   14 |     0 | root
 2 |         1 |    2 |    7 |     1 | Child 1
 3 |         2 |    3 |    4 |     2 | Child 1.1
 4 |         2 |    5 |    6 |     2 | Child 1.2
 5 |         1 |    8 |   13 |     1 | Child 2
 6 |         5 |    9 |   10 |     2 | Child 2.1
 7 |         5 |   11 |   12 |     2 | Child 2.2

Để có được tất cả các con của một cha / mẹ nút, bạn

SELECT * WHERE lft IS BETWEEN parent.lft AND parent.rgt

Để có được số lượng trẻ em, đó là

(right - left - 1)/2

Để đưa một nút và tất cả tổ tiên của nó trở về gốc, bạn

SELECT * WHERE node.lft IS BETWEEN lft AND rgt

Như bạn có thể thấy, các truy vấn sẽ là cây nhị phân đệ quy và cực kỳ chậm đột nhiên khá nhanh. Tiện lợi phải không?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP:Gọi thủ tục lưu trữ MySQL với cả tham số INPUT VÀ OUTPUT (KHÔNG VÀO)

  2. trường văn bản loại đầu vào đưa ra lỗi đã sửa 2147483647

  3. Chỉ mục không xác định:tên người dùng trong C:\ wamp \ www \ Website \ storeadmin \ admin_login.php..và mật khẩu cũng vậy

  4. Cú pháp MySQL để tham gia cập nhật

  5. Làm cách nào để tôi có thể Chèn nhiều hàng vào một bảng MySQL và trả về các ID mới?