Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:como consultar pai-filho?


Aqui está uma idéia. Mas é baseado em muitas suposições sobre a forma como seus dados são configurados. Cada vez mais IDs na árvore, apenas dois níveis, etc.
SELECT f.foo_id,f.foo_parent_id FROM foo f
foo f

--me dê o número X superior de parent_ids(Isso é bom, basta ajustar o LIMIT 10 para variar o número de níveis pai a serem exibidos)
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

(Esta parte é meio hacky, já que você tem que colocar uma string cada vez maior delas para passar de dois filhos)

--é o primeiro filho, ou...
(f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id)
 )
 or

--é o segundo filho, ou...
(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 

--é o pai
 f.foo_parent_id is null
order by isnull(f.foo_parent_id,f.foo_id)*100 + f.foo_id

Então, o que estamos fazendo aqui é basicamente ordenar pela coluna parent_id e, em seguida, as colunas filhas abaixo dela com uma leve torção. Se a coluna parentid for NULL, usaremos o ID real. Isso significa que, para fins de ordenação, nossa tabela se parece com isso:
==============================================================================
| 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
----------------------------------------------------------------------

Em seguida, multiplicamos essa coluna de ordenação * 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
----------------------------------------------------------------------

e por último adicionamos nossa coluna foo_id a ela
==============================================================================
| 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
----------------------------------------------------------------------

Agora ordenamos a tabela por essa coluna virtual e...
==============================================================================
| 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
----------------------------------------------------------------------

Aqui vamos nós!