sql >> Database >  >> RDS >> Mysql

Bovenliggende MySQL op het hoogste niveau ophalen

U moet hiervoor de opgeslagen procedure gebruiken.

Vind alle rijen met doorzoekbaar =1, sla hun id's en parent_id's op in een tijdelijke tabel. Voer vervolgens self-joins uit om ouders aan deze tijdelijke tabel toe te voegen. Herhaal dit totdat er geen rijen meer kunnen worden toegevoegd (het is natuurlijk beter om ervoor te zorgen dat de boom niet cyclisch is). Aan het einde heb je alleen een tabel met rijen met een doorzoekbare afstammeling ergens in de boom, dus toon alleen rijen zonder ouder (bovenaan).

Ervan uitgaande dat uw tafel 'my_table' heet, zou deze moeten werken:

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 ;

Noem het dan gewoon:

CALL top_level_parents();

zal gelijk zijn aanSELECT id FROM my_table WHERE id_is_top_level_and_has_searchable_descendant



  1. wat is het probleem met AttachDbFilename

  2. Oracle-parameters met IN-instructie?

  3. PHP - verbinding maken met mysql-database vanaf een andere server

  4. Hoe werk ik met zeer nauwkeurige decimalen in PHP