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

Output MYSQL dalam format pohon ATAU Menambahkan level (Induk-Anak)

Meskipun Anda tidak dapat melakukannya dengan satu kueri, Anda dapat melakukannya dengan prosedur tersimpan... Satu-satunya prasyarat, Anda perlu menambahkan 2 rekaman lagi ke tabel sampel yang ada untuk menyatakan bahwa "C1" dan "C2" ADALAH tingkat atas... Tambahkan catatan di mana bidang "Induk" kosong, dan tingkat anak adalah "C1" dan satu lagi untuk "C2". Ini akan "mempersiapkan" level induk paling atas. untuk asosiasi hierarki berikutnya, jika tidak, Anda tidak memiliki "dasar" awal hierarki tingkat atas. Ini juga membutuhkan kolom "kunci utama" (yang saya buat dalam skrip ini sebagai "IDMyTable" yang hanya 1-x berurutan, tetapi akan menganggap Anda memiliki kolom kenaikan otomatis di tabel Anda untuk digunakan sebagai gantinya).

Saya telah menyertakan semua kolom output untuk menunjukkan BAGAIMANA itu dibangun, tetapi premis dari rutinitas ini adalah untuk membuat tabel berdasarkan output kolom yang diharapkan, namun ekstra untuk menahan representasi hierarkis di hilir saat sedang dibangun. Untuk MEMASTIKAN mereka mempertahankan orientasi yang benar saat lapisan semakin dalam, saya menggabungkan kolom "ID" -- Anda akan melihat cara kerjanya di kumpulan hasil akhir.

Kemudian, dalam kumpulan hasil akhir, saya memberi ruang pra-padding berdasarkan seberapa dalam data hierarkinya.

Loop akan menambahkan catatan apa pun berdasarkan induknya yang ditemukan di kumpulan hasil sebelumnya, tetapi hanya jika ID belum ditambahkan (mencegah duplikat)...

Untuk melihat bagaimana urutan siklus terus-menerus ditambahkan, Anda dapat menjalankan kueri terakhir TANPA urutan menurut dan melihat bagaimana setiap iterasi memenuhi syarat dan menambahkan tingkat hierarki sebelumnya diterapkan...

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetHierarchy2`()
BEGIN
    -- prepare a hierarchy level variable 
    set @hierlvl := 00000;

    -- prepare a variable for total rows so we know when no more rows found
    set @lastRowCount := 0;

    -- pre-drop temp table
    drop table if exists MyHierarchy;

    -- now, create it as the first level you want... 
    -- ie: a specific top level of all "no parent" entries
    -- or parameterize the function and ask for a specific "ID".
    -- add extra column as flag for next set of ID's to load into this.
    create table MyHierarchy as
    select 
            t1.IDMyTable,
            t1.Child AS Parent,
            @hierlvl as IDHierLevel,
            cast( t1.IDMyTable as char(100)) FullHierarchy
        from
            MyTable t1
        where
                t1.Parent is null
            OR t1.Parent = '';


    -- how many rows are we starting with at this tier level
    set @lastRowCount := ROW_COUNT();

    -- we need to have a "primary key", otherwise our UPDATE
    -- statement will nag about an unsafe update command
    alter table MyHierarchy add primary key (IDMyTable);


    -- NOW, keep cycling through until we get no more records
    while @lastRowCount > 0 do

        -- NOW, load in all entries found from full-set NOT already processed
        insert into MyHierarchy
            select 
                    t1.IDMyTable,
                    t1.Child as Parent,
                    h1.IDHierLevel +1 as IDHierLevel,
                    concat_ws( ',', h1.FullHierarchy, t1.IDMyTable ) as FullHierarchy
                from
                    MyTable t1
                        join MyHierarchy h1
                            on t1.Parent = h1.Parent
                    left join
                        MyHierarchy h2
                            on t1.IDMyTable = h2.IDMyTable
                where
                    h2.IDMyTable is null;


        set @lastRowCount := row_count();

        -- now, update the hierarchy level
        set @hierLevel := @hierLevel +1;

    end while;


    -- return the final set now
    select 
            *, concat( lpad( ' ', 1 + (IDHierLevel * 3 ), ' ' ), Parent ) as ShowHierarchy
        from MyHierarchy
        order by FullHierarchy;

END


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mencari nama lengkap atau nama depan atau belakang di database MySQL dengan nama depan dan belakang di kolom terpisah

  2. BERBEDA ON di django

  3. Pilih semua titik geospasial di dalam kotak pembatas

  4. partisi otomatis database mysql

  5. Joomla! 3 instalasi macet saat membuat tabel database