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ỗiselected
tổ tiên -
intermediate
là con của mỗiselected
tổ tiên cũng là cha mẹ củadescendant
- 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.