#sql
#sql
Вопрос:
"SELECT parent.name
FROM categories AS node,
categories AS parent
WHERE node.left_node BETWEEN parent.left_node AND parent.right_node
AND node.name = '{$node_name}'
ORDER BY parent.right_node AND node.left_node"
Приведенный выше запрос отобразит все родительские данные до корня вызываемого узла. Я хочу получить только следующего родительского элемента, не весь путь до корня, а только узел выше. например, на рисунке ниже
Если я вызову RED, инструкция выведет Fruit и Food, но вместо этого я хотел бы структурировать запрос так, чтобы выводить только самый следующий узел в RED, который является «Fruit», не нужен корневой узел «Food».
Ответ №1:
Вы могли бы использовать тот факт, что левое значение любого узла больше, чем у его родительского (или что правое значение меньше родительского), и использовать limit, чтобы просто вернуть то, что вы хотите.
ORDER BY parent.left_node desc
LIMIT 1
это mysql synax, я не уверен, какую СУБД вы используете.
Мне кажется, что, вероятно, есть лучший способ.
Комментарии:
1. ВЫБЕРИТЕ parent.name ИЗ категорий КАК узла, категории КАК родительские, ГДЕ node.left_node > parent.left_node И node.name = ‘{$node_name}’ ПОРЯДОК ПО parent.left_node DESC LIMIT 1″ Это сработало!
2. Я должен сказать, что в дереве, если я вызову yellow с помощью node.left_node > parent.left_node, в качестве родительского элемента будет выбран RED 🙁 вместо FRUIT. но если я вызову RED, это вызовет Fruit, потому что left_node узла RED просто больше, чем слева от FRUIT. ? Позвольте мне попробовать другое условие с меньшим, чем
3. Спасибо, Пол, это решило проблему. Я вижу, что SQL очень мощный
4. если я хочу указать food, мне тогда пришлось бы ограничить его значением 2? но затем, когда я делаю это, он отображает Fruit и Food при вызове RED, я просто хочу отобразить FRuit сейчас. это было бы ГДЕ node.left_node > parent.left_node И node.right_node < parent.right_node -1?