Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk melaksanakan pertanyaan menu berbilang peringkat MySql

Bagaimana untuk melaksanakan pertanyaan menu berbilang peringkat MySql

王林
王林ke hadapan
2023-05-27 16:38:301506semak imbas

Latar Belakang

Kami sering menghadapi keperluan ini di tempat kerja (terutamanya dalam projek tradisional), iaitu pertanyaan berstruktur pokok (pertanyaan berbilang peringkat termasuk: pertanyaan struktur organisasi (jabatan pengguna) Dan berbilang -pertanyaan menu peringkat

Sebagai contoh, menu dibahagikan kepada tiga peringkat, menu peringkat pertama, menu peringkat kedua dan menu peringkat ketiga Pengguna dikehendaki menanyakan menu pada semua peringkat mengikut struktur pokok. Seperti yang ditunjukkan dalam rajah di bawah

Bagaimana untuk melaksanakan pertanyaan menu berbilang peringkat MySql

Untuk tahap tetap dan sebilangan kecil tahap, biasanya 3 tahap, pelaksanaan keperluan adalah sangat mudah level, dan kemudian tanya level atas dalam urutan , dan akhirnya kumpulkan dan kembalikan ke hujung hadapan.

Maka persoalannya ialah, jika bilangan tahap sangat besar, 10 tahap, atau tahap tidak pasti, ada yang 3 tahap, ada 5 tahap, ada 8 tahap, tahap tetap dan bilangan peringkat adalah sama seperti sebelumnya. Berbanding dengan Mari kita panggil ia jadual pokok:

CREATE TABLE tree (
	id int not null auto_increment,
	name varchar(50) not null comment '名称',
	parent_id int not null default 0 comment '父级id',
	level int not null default 1 comment '层级,从1开始',
    created datetime,
    modified datetime
);
Proses pertanyaan tiga peringkat: tanya pepohon peringkat ketiga, tanya pepohon peringkat kedua mengikut parent_id bagi pepohon peringkat ketiga, dan tanya pepohon peringkat pertama dengan pepohon cara yang sama, pepohon belakang memasang data pepohon dan mengembalikannya ke pepohon hadapan.

Pertanyaan berbilang peringkat (tahap tidak tetap/tahapnya sangat mendalam)

Dalam kes ini, perkara pertama yang kita fikirkan ialah pertanyaan subkueri atau jadual bersama, tetapi ia tidak boleh digunakan dalam pembangunan sebenar. Semua orang tahu sebabnya:

Pernyataan SQL adalah kompleks dan terdedah kepada ralat

  • Isu prestasi mungkin disebabkan oleh pemimpin

  • Jadi cara terbaik ialah menambah table tree_depth untuk mengekalkan hubungan kedalaman hierarki.

    CREATE TABLE tree_depth (
    	id int not null auto_increment,
    	root_id int not null default 0 comment '根节点(祖先节点)id',
        tree_id int not null default 0 comment '当前节点id',
    	depth int not null default 0 comment '深度(当前节点 tree_id 到 根节点 root_id 的深度)',
        created datetime
    );

    Medan kedalaman dalam jadual mewakili: kedalaman dari tree_id nod semasa ke root_id nod akar, bukan kedalaman keseluruhan cawangan di mana nod semasa berada Kedalaman semua nod berbanding dengan dirinya sendiri ialah 0
Dengan jadual tree_depth, adalah mudah untuk menanyakan data organisasi nod peringkat N:

Melintasi keseluruhan pepohon:

Semak semua nod secara langsung dengan level = 1 dalam pepohon, dan kemudian alih keluar carian id nod ini untuk nod bawahan berdasarkan parent_id Selepas menanyakan semua nod, gambar rajah pepohon yang lengkap boleh dipasang dan dikembalikan ke hujung hadapan

Carian nod. keseluruhan cawangan di mana nod ini terletak)

Soal pokok nodN daripada jadual pokok


  • Mengikut id nilai treeN, tanya jadual tree_depth untuk mendapatkan id nod akarnya:select * from tree where id = N


  • Soal semua data cawangan nod semasa tree_depth berdasarkan root_idselect root_id from tree_depth where tree_id = #{treeId}


  • Soal jadual tree_depth Keluarkan semua nod tree_id semasaselect * from tree_depth where root_id = #{rootId}


  • dan pasangkan struktur pokok cawangan select * from tree where id in (?,?,?)

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pertanyaan menu berbilang peringkat MySql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam