Bạn sẽ phải sử dụng quy trình được lưu trữ để thực hiện.
Tìm tất cả các hàng có khả năng tìm kiếm =1, lưu trữ id và parent_id của chúng trong một bảng tạm thời, sau đó tự tham gia để thêm các hàng cha mẹ vào bảng tạm thời này. Ở cuối bảng, bạn chỉ có một bảng với các hàng có phần tử con có thể tìm kiếm được ở đâu đó dưới cây, vì vậy chỉ hiển thị các hàng không có gốc (ở trên cùng).
Giả sử bảng của bạn được gọi là 'my_table' thì bảng này sẽ hoạt động:
DELIMITER //
DROP PROCEDURE IF EXISTS top_level_parents//
CREATE PROCEDURE top_level_parents()
BEGIN
DECLARE found INT(11) DEFAULT 1;
DROP TABLE IF EXISTS parent_tree;
CREATE TABLE parent_tree (id int(11) PRIMARY KEY, p_id int(11)) ENGINE=HEAP;
INSERT INTO parent_tree
SELECT id, parent_id FROM my_table
WHERE searchable = 1;
SET found = ROW_COUNT();
WHILE found > 0 DO
INSERT IGNORE INTO parent_tree
SELECT p.id, p.parent_id FROM parent_tree c JOIN my_table p
WHERE p.id = c.p_id;
SET found = ROW_COUNT();
END WHILE;
SELECT id FROM parent_tree WHERE p_id = 0;
DROP TABLE parent_tree;
END;//
DELIMITER ;
Sau đó, chỉ cần gọi nó:
CALL top_level_parents();
sẽ bằng SELECT id FROM my_table WHERE id_is_top_level_and_has_searchable_descendant