Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

335
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!