Структурирование инструкции SQL для отображения по глубине

#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"
  

Приведенный выше запрос отобразит все родительские данные до корня вызываемого узла. Я хочу получить только следующего родительского элемента, не весь путь до корня, а только узел выше. например, на рисунке ниже

http://img97.imageshack.us/img97/7139/fruittree.gif

Если я вызову 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?