sql >> Base de Datos >  >> RDS >> Mysql

MySQL:¿cómo consultar padre-hijo?

Aquí hay una idea. Pero se basa en muchas suposiciones sobre la forma en que se configuran sus datos. Cada vez más identificaciones en el árbol, solo dos niveles, etc.

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

--dame el número X superior de parent_ids(Esto es bueno, solo ajusta el LÍMITE 10 para variar el número de niveles de padres para mostrar)

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 es un poco complicada, ya que tienes que poner una cadena cada vez más larga de estos para superar a dos niños)

--es el primer hijo, o...

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

--es el segundo hijo, o...

(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 

--es el padre

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

Entonces, lo que estamos haciendo aquí es básicamente ordenar por la columna parent_id y luego las columnas secundarias debajo de ella con un ligero giro. Si la columna parentid es NULL, entonces usamos la ID real. Esto significa que, para realizar pedidos, nuestra tabla se ve así:

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

Luego multiplicamos esa columna de orden *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
----------------------------------------------------------------------

y, por último, le agregamos nuestra columna 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
----------------------------------------------------------------------

Ahora ordenamos la tabla por esa columna virtual y...

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

¡Allá vamos!