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

MySQL:bagaimana cara menanyakan orang tua-anak?

Inilah satu ide. Tetapi ini didasarkan pada banyak asumsi tentang cara pengaturan data Anda. Pernah meningkatkan ID di bawah pohon, hanya dua level, dll.

SELECT f.foo_id,f.foo_parent_id FROM foo f
foo f

--beri saya nomor X teratas parent_ids(Ini bagus, Anda cukup menyesuaikan LIMIT 10 untuk memvariasikan jumlah tingkat induk yang akan ditampilkan)

INNER JOIN 
(select foo_id from foo where foo_parent_id is null order by foo_parent_id 
LIMIT 10
) top_foo_parent
      on isnull(f.foo_parent_id,f.foo_id) = top_foo_parent.foo_id
WHERE

(Bagian ini agak rumit, karena Anda harus memasang string yang lebih panjang untuk melewati dua anak)

--itu anak pertama, atau...

(f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id)
 )
 or

--Ini anak kedua, atau...

(f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id  and fc1.foo_id not in (select MIN(foo_id) from foo fc2 where fc2.foo_parent_id=f.foo_parent_id))
 )
 or 

--itu adalah orang tua

 f.foo_parent_id is null
order by isnull(f.foo_parent_id,f.foo_id)*100 + f.foo_id

Jadi yang kita lakukan di sini pada dasarnya adalah mengurutkan berdasarkan kolom parent_id dan kemudian kolom anak di bawahnya dengan sedikit perubahan. Jika kolom parentid adalah NULL maka kami menggunakan ID yang sebenarnya. Ini berarti bahwa untuk tujuan pemesanan, tabel kita terlihat seperti ini:

==============================================================================
| foo_id | foo_parent_id |   isnull(f.foo_parent_id,f.foo_id)
==============================================================================
| 1      | NULL           |         (1)
| 2      | NULL           |         (2)
| 3      |  1             |         1
| 4      |  2             |         2
| 5      |  1             |         1
| 7      |  2             |         2
----------------------------------------------------------------------

Kemudian kita kalikan kolom pemesanan itu *100

==============================================================================
| foo_id | foo_parent_id |   isnull(f.foo_parent_id,f.foo_id)*100
==============================================================================
| 1      | NULL           |         100
| 2      | NULL           |         200
| 3      |  1             |         100
| 4      |  2             |         200
| 5      |  1             |         100
| 7      |  2             |         200
----------------------------------------------------------------------

dan terakhir kita tambahkan kolom foo_id kita ke dalamnya

==============================================================================
| foo_id | foo_parent_id |   isnull(f.foo_parent_id,f.foo_id)*100 + foo_id
==============================================================================
| 1      | NULL           |         101
| 2      | NULL           |         202
| 3      |  1             |         103
| 4      |  2             |         204
| 5      |  1             |         105
| 7      |  2             |         207
----------------------------------------------------------------------

Sekarang kita memesan meja dengan kolom virtual itu dan...

==============================================================================
| foo_id | foo_parent_id |   ORDER BY isnull(f.foo_parent_id,f.foo_id)*100 + foo_id
==============================================================================
| 1      | NULL           |         101
| 3      |  1             |         103
| 5      |  1             |         105
| 2      | NULL           |         202    
| 4      |  2             |         204
| 7      |  2             |         207
----------------------------------------------------------------------

Ini dia!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konversikan file BibTex ke entri database menggunakan Python

  2. Bagaimana cara keluar dari karakter khusus mysql dengan sockets.io/node.js/javascript

  3. Laravel:Indeks tidak terdefinisi:driver

  4. MySQL melempar kesalahan nilai string yang salah

  5. Laravel - Membuat catatan Acak paginasi