Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Recuperar MySQL pai de nível superior


Você terá que usar o procedimento armazenado para fazer isso.

Encontre todas as linhas com searchable =1, armazene seus ids e parent_ids em uma tabela temporária. Em seguida, faça auto-junções para adicionar pais a esta tabela temporária. Repita até que não seja possível adicionar mais linhas (obviamente, é melhor garantir que a árvore não seja cíclica). No final, você tem uma tabela apenas com linhas que possuem um descendente pesquisável em algum lugar na árvore, então apenas mostre apenas linhas sem pai (no topo).

Supondo que sua tabela seja chamada 'my_table', esta deve funcionar:
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 ;

Depois é só chamar:
CALL top_level_parents();

será igual aSELECT id FROM my_table WHERE id_is_top_level_and_has_searchable_descendant