Я только начинаю с 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?
Заранее спасибо.