Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Ambil induk MySQL tingkat atas

Anda harus menggunakan prosedur tersimpan untuk melakukannya.

Temukan semua baris dengan searchable =1, simpan id dan parent_ids mereka di tabel temp. Kemudian lakukan self-join untuk menambahkan orang tua ke tabel temp ini. Ulangi sampai tidak ada lagi baris yang dapat ditambahkan (jelas lebih baik pastikan pohon tidak siklis). Pada akhirnya Anda hanya memiliki tabel dengan baris yang memiliki turunan yang dapat dicari di suatu tempat di bawah pohon, jadi tampilkan hanya baris tanpa induk (di atas).

Dengan asumsi tabel Anda disebut 'my_table' yang ini seharusnya berfungsi:

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 ;

Kemudian panggil saja:

CALL top_level_parents();

akan sama denganSELECT 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. SQL Performance UNION vs OR

  2. Beberapa Kunci Asing ke tabel yang sama Gas Orm

  3. Bagaimana cara menghapus dari beberapa tabel di MySQL?

  4. FindByUUID() menggunakan Repositori JPA Spring Data

  5. Cara Mendapatkan Meta Data Basis Data