sql >> Databáze >  >> RDS >> Mysql

MySQL:jak se dotazovat rodič-dítě?

Tady je jeden nápad. Ale je to založeno na mnoha předpokladech o způsobu nastavení vašich dat. Stále rostoucí ID ve stromu, pouze dvě úrovně atd.

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

--uveďte nejvyšší X počet parent_ids(To je dobré, stačí upravit LIMIT 10, abyste změnili počet rodičovských úrovní, které se mají zobrazit)

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

(Tato část je trochu otřepaná, protože musíte dát stále delší řetězec, abyste se dostali přes dvě děti)

--je to první dítě, nebo...

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

--je to druhé dítě, nebo...

(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 

--je to rodič

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

Takže to, co zde děláme, je v podstatě řazení podle sloupce parent_id a potom podřízených sloupců pod ním s mírným otočením. Pokud má sloupec parentid hodnotu NULL, použijeme skutečné ID. To znamená, že pro účely objednání vypadá naše tabulka takto:

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

Potom tento sloupec řazení vynásobíme *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
----------------------------------------------------------------------

a nakonec do něj přidáme náš sloupec foo_id

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

Nyní seřadíme tabulku podle tohoto virtuálního sloupce a...

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

Jdeme na to!



  1. GROUP BY WITH HAVING (DISTINCT):PHP, MYSQL

  2. SQL dotaz, výběr 5 nejnovějších v každé skupině

  3. poddotaz - získání nejvyššího skóre

  4. Nástroje pro grafy Google s PHP a MySQl