我的目标是使用最新的MySQL WITH RECURSIVE方法构建一棵树。
我的表名为“categories”,其中包含2行:“ID”和“parentID”。
我的类别表:
这是我的 mySQL 递归公共表达式查询,其中带有 LIMIT 子句导致问题:
请注意,我正在使用MySQL 8.0+版本。 我知道错误很明显,但是如果有100万个子级在同一个父级下面呢? 这将会冻结系统!
我非常感谢任何解决方法。
谢谢。
我的表名为“categories”,其中包含2行:“ID”和“parentID”。
我的类别表:
. 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
.... . | ...
从2到9的ID都有相同的父级,该父级的ID为1。我试图通过在递归公共表达式的第二个SELECT查询中提供 "LIMIT 5" 来限制这种情况。
上述表格在树形结构中的光学表示将类似于以下内容:我的问题是限制相同层级的子项数量(如下图所示标记为Item Y)。
+ 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
这是我的 mySQL 递归公共表达式查询,其中带有 LIMIT 子句导致问题:
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
从逻辑上讲,我希望通过在CTE的第二个SELECT语句中使用LIMIT子句来限制返回的行数,从而解决我的问题。但是它给了我一个错误:
This version of MySQL doesn't yet support 'ORDER BY / LIMIT over UNION in recursive Common Table Expression'
请注意,我正在使用MySQL 8.0+版本。 我知道错误很明显,但是如果有100万个子级在同一个父级下面呢? 这将会冻结系统!
我非常感谢任何解决方法。
谢谢。