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

Làm cách nào tôi có thể tìm thấy tất cả các anh chị em cho nút của tôi và các anchestor của nó trong một cây danh mục phân cấp?

Tôi không chắc mình làm theo tất cả những điều đó, nhưng có vẻ như bạn muốn tất cả những đứa trẻ ngay lập tức thuộc loại 5.

Đây là một cách để làm điều đó:

SELECT child.*
FROM Category parent
  JOIN Category child 
    ON (child.lft BETWEEN parent.lft AND parent.rgt)
  LEFT JOIN Category intermediate 
    ON (intermediate.lft > parent.lft AND intermediate.rgt < parent.rgt
      AND child.lft > intermediate.lft AND child.rgt < intermediate.rgt)
WHERE intermediate.CategoryId IS NULL
  AND parent.CategoryId = ?;

chỉnh sửa: Được rồi, bây giờ tôi hiểu rằng giải pháp trên chỉ là một phần của những gì bạn muốn. Bạn muốn:

  • Tổ tiên trực tiếp của đầu đĩa CD
  • "Các chú" của người chơi CD (anh chị em của tổ tiên)
  • Anh chị em của đầu đĩa CD
  • Con của đầu đĩa CD

Hãy để tôi làm việc đó trong vài phút.

Đây là những gì tôi nghĩ ra:

SELECT descendant.*,
  (current.lft BETWEEN descendant.lft AND descendant.rgt) AS is_selected,
  COUNT(DISTINCT c.CategoryId) AS depth
FROM Category current
JOIN Category selected 
  ON (current.lft BETWEEN selected.lft AND selected.rgt)
JOIN Category descendant 
  ON (descendant.lft BETWEEN selected.lft AND selected.rgt)
LEFT JOIN Category intermediate 
  ON (intermediate.lft > selected.lft AND intermediate.rgt < selected.rgt
    AND descendant.lft > intermediate.lft AND descendant.lft < intermediate.rgt)
JOIN Category c
  ON (descendant.lft BETWEEN c.lft AND c.rgt)
WHERE intermediate.CategoryId IS NULL
  AND current.CategoryId = ?
GROUP BY descendant.CategoryId
ORDER BY depth, descendant.name;
  • current là đầu đĩa CD
  • selected là tổ tiên của đầu đĩa CD (điện tử, điện tử cầm tay, đầu đĩa CD)
  • descendant là bất kỳ con hoặc cháu nào, v.v. của mỗi selected tổ tiên
  • intermediate là con của mỗi selected tổ tiên cũng là cha mẹ của descendant - không được có cái nào trong số này, do đó IS NULL hạn chế.
  • c là chuỗi tổ tiên từ descendant sao lưu lên trên cùng, nhằm mục đích xác định độ sâu.

Tôi chỉ nhận ra rằng giải pháp của tôi cũng sẽ trả về tất cả các con của current nút. Vì vậy, nếu bạn hiện đang xem "thiết bị điện tử di động", truy vấn sẽ trả về con của nó, nhưng nó cũng sẽ trả về "flash" cháu có thể không phải là thứ bạn muốn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thông báo 'PDOException' không có ngoại lệ 'tên nguồn dữ liệu không hợp lệ'

  2. Kết quả sắp xếp Laravel theo các giá trị cụ thể

  3. Cách lấy người dùng từ cơ sở dữ liệu hiện có cho IDServer4

  4. Cách sắp xếp và nhóm các kết quả MySQL

  5. MySQL - Làm thế nào để tăng kích thước varchar của một cột hiện có trong cơ sở dữ liệu mà không phá vỡ dữ liệu hiện có?