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

Penyortiran Mysql Data hierarkis

Saya telah mempelajari http://explainextended.com/2009/03 /17/hierarchical-queries-in-mysql/ dan menemukan solusi untuk masalah Anda. Saya kira Anda sudah memiliki solusi Anda, tetapi untuk orang lain yang mencari solusi yang sama, saya akan menjawab di sini.

Solusi saya akan berfungsi untuk Tabel relasional juga karena kami tidak dapat menetapkan nol (0) di bidang induk dalam tabel relasional. Ini akan menjadi NULL dan solusi saya juga berfungsi sempurna untuk tabel relasional.

Fungsi

DROP FUNCTION IF EXISTS hierarchy_connect_by_parent_eq_prior_id;
DELIMITER $$
CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INTEGER
NOT DETERMINISTIC
READS SQL DATA
BEGIN
    DECLARE _parent INT;
    DECLARE _rank INT;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;

    SET _parent = @id;
    SET _rank = 0;

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

    LOOP
        SET @innerrank = 0;
        SELECT p.id 
        INTO   @id
        FROM   (
                SELECT   id, @innerrank := @innerrank+1 AS rank 
                FROM     yourTable 
                WHERE    COALESCE(parent, 0) = _parent 
                ORDER BY yourField
                ) p 
        WHERE   p.rank > _rank LIMIT 0, 1;
        IF @id IS NOT NULL OR _parent = @start_with THEN
                SET @level = @level + 1;
                RETURN @id;
        END IF;
        SET @level := @level - 1;
        SET @innerrank = 0;
        SELECT COALESCE(p.parent, 0), p.rank
        INTO   _parent, _rank
        FROM   (
                SELECT id, parent, @innerrank := @innerrank+1 AS rank
                FROM    yourTable
                WHERE   COALESCE(parent, 0) = (
                    SELECT COALESCE(parent, 0) FROM yourTable WHERE id = _parent
                    ) 
                ORDER BY yourField
               ) p
        WHERE p.id = _parent;
    END LOOP;       
END;
$$
DELIMITER ;

Silakan ganti yourTable dengan nama tabel Anda dan yourField dengan nama bidang yang ingin Anda urutkan datanya.

Permintaan

SELECT ou.* FROM (
    SELECT hi.id, parent, yourField 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, yourTable 
            WHERE @id IS NOT NULL
        ) ho 
    JOIN yourTable hi ON hi.id = ho.id
) ou

Silakan ganti yourTable dengan nama tabel Anda dan yourField dengan nama bidang yang ingin Anda tampilkan.

Ini akan menghasilkan hasil seperti yang Anda butuhkan. Saya mengujinya dan bekerja dengan baik.

Ini http://sqlfiddle.com/#!9/9d060d/2 untuk melihatnya beraksi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menginstal driver QMYSQL

  2. Cara menginstal permata MySQL di Mac OS X

  3. Bagaimana cara hanya memilih data numerik dari mysql?

  4. group_concat dipotong saat menjalankan kueri di atas meja

  5. Bagaimana saya bisa menggunakan transaksi dalam prosedur tersimpan MySQL saya?