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

Apa cara paling sederhana untuk mendapatkan semua orang tua dari catatan menggunakan model id / parent_id di mysql/php?

Dimungkinkan untuk melakukannya di MySQL , tetapi Anda harus membuat fungsi dan menggunakannya dalam kueri.

Lihat entri ini di blog saya untuk penjelasan rinci:

Berikut adalah fungsi dan querynya:

CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
        DECLARE _id INT;
        DECLARE _parent INT;
        DECLARE _next INT;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;

        SET _parent = @id;
        SET _id = -1;

        IF @id IS NULL THEN
                RETURN NULL;
        END IF;

        LOOP
                SELECT  MIN(id)
                INTO    @id
                FROM    place
                WHERE   parent = _parent
                        AND id > _id;
                IF @id IS NOT NULL OR _parent = @start_with THEN
                        SET @level = @level + 1;
                        RETURN @id;
                END IF;
                SET @level := @level - 1;
                SELECT  id, parent
                INTO    _id, _parent
                FROM    place
                WHERE   id = _parent;
        END LOOP;
END

SELECT  id, parent
FROM    (
        SELECT  hierarchy_connect_by_parent_eq_prior_id(id) AS id, @level AS level
        FROM    (
                SELECT  @start_with := 0,
                        @id := @start_with,
                        @level := 0
                ) vars, t_hierarchy
        WHERE   @id IS NOT NULL
        ) ho
JOIN    place hi
ON      hi.id = ho.id

Kueri terakhir akan memilih semua turunan dari simpul tertentu (yang harus Anda atur di @start_with variabel)

Untuk menemukan semua ancestor dari node yang diberikan, Anda dapat menggunakan query sederhana tanpa fungsi:

SELECT  @r AS _id,
        @r := (
        SELECT  parent
        FROM    place
        WHERE   id = _id
        ) AS parent
FROM    (
        SELECT  @r := @node_id
        ) vars,
        place

Artikel di blog saya ini menjelaskan pertanyaan ini secara lebih rinci:

Agar kedua solusi ini berfungsi dalam waktu yang wajar, Anda harus memiliki indeks di kedua id dan parent .

Pastikan id didefinisikan sebagai PRIMARY KEY dan Anda memiliki indeks seconday di parent .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menemukan dan mengganti teks di tabel mysql

  2. Filter antara dua tanggal MYSQL

  3. MySQL:bagaimana cara menghapus semua karakter tunggal dari sebuah string?

  4. mysql menghitung total dari bidang dengan nilai yang dipisahkan koma

  5. Menyortir tabel Tag MYSQL