Mysql
 sql >> Base de données >  >> RDS >> Mysql

Récupérer MySQL parent de niveau supérieur

Vous devrez utiliser une procédure stockée pour le faire.

Trouvez toutes les lignes avec searchable =1, stockez leurs identifiants et parent_ids dans une table temporaire. Ensuite, faites des auto-jointures pour ajouter des parents à cette table temporaire. Répétez jusqu'à ce qu'aucune autre ligne ne puisse être ajoutée (évidemment, mieux vaut s'assurer que l'arbre n'est pas cyclique). À la fin, vous avez un tableau uniquement avec des lignes qui ont un descendant interrogeable quelque part dans l'arborescence, donc affichez uniquement les lignes sans parent (en haut).

En supposant que votre table s'appelle "my_table", celle-ci devrait fonctionner :

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 ;

Ensuite, appelez-le :

CALL top_level_parents();

sera égal àSELECT id FROM my_table WHERE id_is_top_level_and_has_searchable_descendant