просто чтобы добавить к этим ответам, которые мне очень помогли,
Мне нужно было найти непосредственного родителя узла, а также родителя самого верхнего уровня цепочки узлов в некоторых случаях,
я использовал следующее в качестве базы для получения элементов в порядке следования от детей к родителям
SELECT parent.* FROM
nested_set node,
nested_set parent
WHERE (
node.set_left BETWEEN parent.set_left AND parent.set_right
)
AND node.set_id={CHILD_NODE_ID_HERE}
ORDER BY parent.set_right - parent.set_left
#LIMIT 1,1
тогда нужно добавить LIMIT 1,1
, чтобы захватить только вторую строку, которая будет непосредственным родителем
также следует отметить, что в приведенном выше запросе, если сам узел является родителем самого верхнего уровня, он НЕ будет иметь непосредственного родителя , поэтому с LIMIT 1,1
он должен вернуть пустой набор результатов
чтобы получить родительский элемент самого верхнего уровня, я перевернул порядок по предложению, включил проверку того, является ли сам узел верхним родителем, и ограничил результат первой строкой
SELECT parent.* AS top_level_right FROM
nested_set node,
nested_set parent
WHERE (
node.set_left >= parent.set_left
AND node.set_left <= parent.set_right
)
AND node.set_id={CHILD_NODE_ID_HERE}
ORDER BY parent.set_left - parent.set_right
LIMIT 1
в последнем запросе я использовал >= <=
операторы, так что выбранный диапазон охватывает дочерний узел, если он также является родительским элементом верхнего уровня