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

Memilih berdasarkan jalur di mysql

Sebagai informasi, solusi ini didasarkan pada perbandingan string, tidak dioptimalkan &tidak dapat menggunakan indeks. Anda harus mempertimbangkan untuk menormalkan tabel Anda secara berbeda. (Lihat Mengelola Data Hirarki di MySQL )

Mengenai beberapa pertanyaan:

Pilih semua anak dari id 9:

Karena Path kolom tidak menyertakan garis miring awal &akhir, Anda harus menggabungkannya ke jalur:

SELECT * 
FROM tester
WHERE CONCAT('/', path, '/') LIKE '%/9/%';

pilih jumlah gabungan dari 9 anak, x dalam level:

Kita perlu mengelompokkan menurut jumlah garis miring di jalur, dikurangi jumlah garis miring di jalur induk:

SELECT (LENGTH(c.Path) - LENGTH(REPLACE(c.Path, '/', '')))
    - (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) AS Level,
    COUNT(*)
FROM tester c
    JOIN tester p ON c.Parent = p.ID
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
GROUP BY 1

Untuk mempermudah saya menggunakan kueri di atas untuk menampilkan semua level, Jika Anda ingin membatasi kedalaman x level, gunakan WHERE predikat dari kueri di bawah ini.

pilih ID anak 9 hingga level x, dengan level relatif ke 9:

Kami mencari Path kolom hingga jumlah x level, sambil mempertimbangkan level orang tua:

SELECT c.*
FROM tester c
    JOIN tester p ON c.Parent = p.ID
WHERE CONCAT(
    '/',
    SUBSTRING_INDEX(
        Path, 
        '/', 
        (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) + 4
    ),
'/') LIKE '%/9/%'

Langkah-langkah yang kami lakukan:

  1. Kita perlu mencari tahu seberapa dalam induknya, kita dapat menemukannya dengan menghitung garis miring di jalur induknya. (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', '')) )
  2. Kita perlu menambahkan 1 ke angka itu, karena jalur dengan 1 garis miring memiliki kedalaman 2 level.
  3. Kami menambahkan jumlah x level yang diinginkan.
  4. Ambil kolom jalur hingga total level, (Gunakan SUBSTRING_INDEX fungsi).
  5. Tambahkan garis miring di awal dan akhir.
  6. Telusuri string terakhir untuk 9.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Periksa apakah karakter UTF-8 membutuhkan maksimum tiga byte

  2. Bagaimana cara memilih data dari beberapa tabel menggunakan gabungan/subquery dengan benar? (PHP-MySQL)

  3. Permintaan lambat di information_schema.tables

  4. pada pembaruan kunci duplikat dengan syarat?

  5. Bagaimana cara menghubungkan NetBeans ke database MySQL?