Моя цель - построить дерево с использованием новейшего метода MySQL WITH RECURSIVE.
Моя таблица называется categories
и имеет 2 строки. ID
и parentID row
.
Таблица моих категорий:
. 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 = 1. Это то, что Я пытаюсь ограничить, указав «LIMIT 5» во втором запросе SELECT моего рекурсивного общего табличного выражения.
Оптическое представление приведенной выше таблицы в виде дерева будет примерно следующим: Моя проблема состоит в том, чтобы ограничить количество дочерних элементов одного и того же уровня (отмеченного как элемент 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 Recursive Common Table Expression
Запрос с предложением 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
Логически я ожидал отсортировать свою проблему, используя предложение LIMIT в вторая часть Select выражения CTE, чтобы ограничить количество строк, возвращаемых вторым оператором SELECT. Но это дает мне ошибку:
This version of MySQL doesn't yet support 'ORDER BY / LIMIT over UNION in recursive Common Table Expression'
Обратите внимание, что я использую MySQL версии 8.0 +. Я так понимаю ошибка очевидна. Но как насчет того, чтобы у меня 1 миллион детей младше одного родителя? Это приведет к зависанию системы!
Я буду очень признателен за обходной путь.
Спасибо.