Рекурсивный CTE в MySql для древовидной структуры (список смежности) - PullRequest
2 голосов
/ 22 сентября 2011

Я только начинаю с MySQL (я раньше использовал SQL Server). Я еще не начал реализовывать что-либо в MySQL, просто изучал, как что-то делать и с какими проблемами я мог бы столкнуться.

В SQL Server я использовал CTE для успешного выполнения через структуру таблицы списка смежностей для получения желаемого набора результатов. Из того, что я могу сказать до сих пор с MySQL, он не поддерживает CTE. У меня есть довольно простая структура таблиц для хранения моей иерархии (написана на синтаксисе SQL Server, поскольку я с ней знаком):

CREATE TABLE TreeNodes (
    NodeId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    ParentNodeId int NULL,
    Name varchar(50) NOT NULL,
    FullPathName varchar(MAX) NOT NULL,  -- '/' delimited names from root to current node
    IsLeaf bit NOT NULL  -- is this node a leaf?
)

Примечание : я понимаю, что FullPathName и IsLeaf не требуются и могут быть определены во время запроса, но вставка узла дерева будет очень редким явлением в отличие от запросов к этой таблице - именно поэтому я планирую вычислить эти два значения как часть SP вставки (сделает запросы, которым нужны эти два значения, менее затратно).

С CTE (в SQL Server) у меня была бы функция, подобная следующей, чтобы найти конечные узлы текущего узла:

CREATE FUNCTION fn_GetLeafNodesBelowNode (
    @TreeNodeId int
)
RETURNS TABLE
AS
RETURN
WITH Tree (NodeId, Name, FullPathName, IsLeaf)
AS (
    SELECT NodeId, Name, FullPathName, IsLeaf FROM TreeNodes WHERE NodeId = @TreeNodeId
        UNION ALL
    SELECT c.NodeId, c.Name, c.FullPathName, c.IsLeaf FROM Tree t
        INNER JOIN TreeNodes c ON t.NodeId = c.ParentNodeId
)
SELECT * FROM Tree WHERE IsLeaf = 1

Как бы я поступил так же с MySQL?

Заранее спасибо.

1 Ответ

0 голосов
/ 26 июля 2013

Вы можете сделать это с помощью каких-то хранимых функций и битовой логики.

Здесь является одним примером.

Попробуйте.

...