Mysql
 sql >> Database >  >> RDS >> Mysql

Recupera MySQL genitore di primo livello

Dovrai utilizzare la procedura memorizzata per farlo.

Trova tutte le righe con ricercabile =1, memorizza i loro id e parent_ids in una tabella temporanea. Quindi fai i join automatici per aggiungere i genitori a questa tabella temporanea. Ripetere fino a quando non è possibile aggiungere più righe (ovviamente è meglio assicurarsi che l'albero non sia ciclico). Alla fine hai una tabella solo con righe che hanno un discendente ricercabile da qualche parte lungo l'albero, quindi mostra solo le righe senza genitore (in alto).

Supponendo che la tua tabella si chiami 'my_table', questa dovrebbe funzionare:

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 ;

Quindi chiamalo semplicemente:

CALL top_level_parents();

sarà uguale aSELECT id FROM my_table WHERE id_is_top_level_and_has_searchable_descendant