Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abrufen des übergeordneten MySQL der obersten Ebene

Dazu müssen Sie eine gespeicherte Prozedur verwenden.

Finden Sie alle Zeilen mit searchable =1, speichern Sie ihre IDs und parent_ids in einer temporären Tabelle. Führen Sie dann Selbstverknüpfungen durch, um Eltern zu dieser temporären Tabelle hinzuzufügen. Wiederholen Sie dies, bis keine weiteren Zeilen hinzugefügt werden können (stellen Sie natürlich besser sicher, dass der Baum nicht zyklisch ist). Am Ende haben Sie eine Tabelle nur mit Zeilen, die einen durchsuchbaren Nachfolger irgendwo im Baum haben, also zeigen Sie einfach nur Zeilen ohne Eltern (ganz oben).

Angenommen, Ihre Tabelle heißt 'my_table', sollte diese funktionieren:

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 ;

Dann einfach aufrufen:

CALL top_level_parents();

entspricht SELECT id FROM my_table WHERE id_is_top_level_and_has_searchable_descendant