sql >> Databasteknik >  >> RDS >> Mysql

Hämta överordnad MySQL på toppnivå

Du måste använda lagrad procedur för att göra det.

Hitta alla rader med sökbar =1, lagra deras id och parent_id i en temporär tabell. Gör sedan självanslutningar för att lägga till föräldrar till denna temptabell. Upprepa tills inga fler rader kan läggas till (naturligtvis bättre att se till att trädet inte är cykliskt). I slutet har du bara en tabell med rader som har en sökbar ättling någonstans nere i trädet, så visa bara rader utan förälder (överst).

Förutsatt att din tabell heter 'my_table' borde den här fungera:

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 ;

Då är det bara att kalla det:

CALL top_level_parents();

kommer att vara lika medSELECT id FROM my_table WHERE id_is_top_level_and_has_searchable_descendant



  1. Hur gör man time_to_minute i Mysql?

  2. Formatera data i Power BI Desktop Visualizations

  3. Hur man löser mysql-varning:InnoDB:page_cleaner:1000ms avsedd loop tog XXX ms. Inställningarna kanske inte är optimala?

  4. Hur man kör en procedur inuti ett paket i Oracle