sql >> Database teknologi >  >> RDS >> Mysql

MySQL:hvordan forespørger man forældre-barn?

Her er en idé. Men det er baseret på mange antagelser om den måde, dine data er opsat på. Stadig stigende ID'er ned i træet, kun to niveauer osv.

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

--giv mig det øverste X antal af forældre_id'er(Dette er godt, du skal bare justere LIMIT 10 for at variere antallet af overordnede niveauer, der skal vises)

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

(Denne del er lidt hacky, da du skal sætte en stadig længere række af disse for at komme forbi to børn)

--det er det første barn, eller...

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

--det er det andet barn, eller...

(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 

--det er forælderen

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

Så det, vi gør her, er dybest set at sortere efter parent_id-kolonnen og derefter underordnede kolonner under den med et lille twist. Hvis parentid-kolonnen er NULL, bruger vi det faktiske ID. Det betyder, at vores bord til bestillingsformål ser sådan ud:

==============================================================================
| 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
----------------------------------------------------------------------

Så multiplicerer vi den bestillingskolonne *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
----------------------------------------------------------------------

og til sidst tilføjer vi vores foo_id-kolonne til den

==============================================================================
| 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
----------------------------------------------------------------------

Nu sorterer vi tabellen efter den virtuelle kolonne og...

==============================================================================
| 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
----------------------------------------------------------------------

Så går vi!



  1. Datastyring med Python, SQLite og SQLAlchemy

  2. Begræns ConnectionTimeout for Oracle Database

  3. Forældet:mysql_connect()

  4. SQLite - Slet data