K tomu budete muset použít uloženou proceduru.
Najděte všechny řádky s prohledávatelným =1, uložte jejich id a parent_ids do dočasné tabulky. Pak proveďte vlastní spojení pro přidání rodičů do této dočasné tabulky. Opakujte, dokud nebude možné přidat další řádky (samozřejmě je lepší se ujistit, že strom není cyklický). Na konci máte tabulku pouze s řádky, které mají prohledávatelné potomky někde ve stromu, takže zobrazte pouze řádky bez nadřazeného prvku (nahoře).
Za předpokladu, že se vaše tabulka jmenuje 'my_table', by měla fungovat:
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 ;
Pak stačí zavolat:
CALL top_level_parents();
se bude rovnatSELECT id FROM my_table WHERE id_is_top_level_and_has_searchable_descendant