Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pobierz nadrzędny MySQL nadrzędny

Aby to zrobić, będziesz musiał użyć procedury składowanej.

Znajdź wszystkie wiersze z przeszukiwalnymi =1, zapisz ich identyfikatory i identyfikatory parent_id w tabeli tymczasowej. Następnie wykonaj sprzężenia własne, aby dodać rodziców do tej tabeli tymczasowej. Powtarzaj, aż nie będzie można dodać więcej wierszy (oczywiście lepiej upewnij się, że drzewo nie jest cykliczne). Na końcu masz tabelę tylko z wierszami, których potomek można przeszukiwać gdzieś w dół drzewa, więc po prostu pokaż tylko wiersze bez rodzica (u góry).

Zakładając, że Twój stół nazywa się „my_table”, ten powinien działać:

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 ;

Potem po prostu zadzwoń:

CALL top_level_parents();

będzie równy SELECT id FROM my_table WHERE id_is_top_level_and_has_searchable_descendant



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego rozmiar tabeli InnoDB jest znacznie większy niż oczekiwano?

  2. MIN() – Znajdź minimalną wartość w kolumnie w MySQL

  3. Czy różne bazy danych używają różnych cytatów z nazwy?

  4. Tabela SQL z wpisem na liście vs tabela SQL z wierszem dla każdego wpisu

  5. Laravel LewoDołącz gdzie