Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

338
Vistas
No se permite el uso de LIMIT en la expresión de tabla común recursiva en MySQL

Mi objetivo es construir un árbol utilizando el método CON RECURSIVO de MySQL más reciente.

Mi tabla se llama categories y tiene 2 filas. El ID y la parentID row .

Mi tabla de categorías:

 . ID . | ParentID --------|---------- . 1 . | null . 2 . | 1 . 3 . | 1 . 4 . | 1 . 6 . | 1 . 7 . | 1 . 8 . | 1 . 9 . | 1 . 10 . | 1 . 11 . | 13 . 12 . | 14 . 13 . | 12 .... . | ...

Los ID del 2 al 9 tienen el mismo padre que es el padre con ID = 1. Esto es lo que intento limitar al proporcionar un "LIMIT 5" en la segunda consulta SELECCIONAR de mi Expresión de tabla común recursiva.

Una representación óptica de la tabla anterior en un árbol sería algo como lo siguiente: Mi problema es limitar el número de niños del mismo nivel (marcado como Elemento Y en la ilustración de abajo).

 + Item X .............. (level 1) + Item Y .............. (level 2) + Item Y .............. (level 2) + Item Y .............. (level 2) + .... LIMIT to 5 Items + Item X + Item X + Item X + Item X + Item X + Item X

Esta es mi consulta de Recursive Common Table Expression mySQL con la cláusula LIMIT que causa el problema:

 WITH RECURSIVE cte AS ( SELECT ID, 0 AS depth, CAST(ID AS CHAR(200)) AS path FROM categories WHERE parentID = 1 UNION ALL SELECT c.ID, cte.depth+1, CONCAT(cte.path, ',', c.ID) FROM categories c JOIN cte ON cte.ID = c.parentID WHERE FIND_IN_SET(c.ID, cte.path)=0 AND depth <= 10 LIMIT 5 ) SELECT * FROM cte

Lógicamente, esperaba resolver mi problema usando una cláusula LIMIT en la segunda parte Select del CTE para restringir el número de filas devueltas por la segunda declaración SELECT. Pero me da error:

 This version of MySQL doesn't yet support 'ORDER BY / LIMIT over UNION in recursive Common Table Expression'

Tenga en cuenta que estoy usando MySQL versión 8.0 +. Entiendo que el error es claro. Pero, ¿qué pasa si tengo 1 millón de hijos por debajo del mismo padre? ¡Congelará el sistema!

Apreciaré mucho una solución.

Gracias.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Si te seguí correctamente, row_number() puede hacer lo que quieras. La idea es enumerar las filas de categories en la parte recursiva, luego filtrar en los primeros 5:

 with recursive cte as ( select id, 0 as depth, cast(id as char(200)) as path from categories where parentid = 1 union all select c.id, cte.depth+1, concat(cte.path, ',', c.id) from cte inner join ( select c.*, row_number() over(partition by c.parentid order by c.id) rn from categories c ) c on cte.id = c.parentid where find_in_set(c.id, cte.path) = 0 and depth <= 10 and c.rn <= 5 ) select * from cte

Puede optimizar esto un poco filtrando previamente el conjunto de datos:

 with recursive cats as ( select * from ( select c.*, row_number() over(partition by parentid order by id) rn from categories c ) t where rn <= 5 ), cte as ( select id, 0 as depth, cast(id as char(200)) as path from cats where parentid = 1 union all select c.id, cte.depth+1, concat(cte.path, ',', c.id) from cte inner join cats c on cte.id = c.parentid where find_in_set(c.id, cte.path) = 0 and depth <= 10 and c.rn <= 5 ) select * from cte
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda