MySQL Nested Sets - Как найти родителя узла?

Заметьте, что прежде, чем вызвать размещение new, необходимо назвать деструктор на памяти †“, по крайней мере, если объект или имеет нетривиальный деструктор или содержит участников, которые имеют.

Для объектного указателя obj из класса Foo деструктор можно явно назвать следующим образом:

obj->~Foo();
11
задан OMG Ponies 21 October 2009 в 18:11
поделиться

4 ответа

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

SELECT title, (SELECT TOP 1 title 
           FROM tree t2 
           WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt    
           ORDER BY t2.rgt-t1.rgt ASC) AS parent
FROM tree t1
ORDER BY rgt-lft DESC

Я надеюсь, что есть то, что вам нужно.

Для следующей таблицы:

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |

он выдает результат:

title                | parent
----------------------------------------------
ELECTRONICS          | NULL
PORTABLE ELECTRONICS | ELECTRONICS
TELEVISIONS          | ELECTRONICS
MP3 PLAYERS          | PORTABLE ELECTRONICS
FLASH                | MP3 PLAYERS
CD PLAYERS           | PORTABLE ELECTRONICS
2 WAY RADIOS         | PORTABLE ELECTRONICS
TUBE                 | TELEVISIONS
LCD                  | TELEVISIONS
PLASMA               | TELEVISIONS
20
ответ дан 3 December 2019 в 01:13
поделиться

Все предки возвращаются

SELECT id FROM thetable
WHERE x BETWEEN lft and rgt;

Итак, прямой родитель - это предок с наименьшей разницей между lft и rgt.

SELECT id FROM thetable
WHERE x BETWEEN lft and rgt
ORDER BY (rgt-lft)
LIMIT 1
0
ответ дан 3 December 2019 в 01:13
поделиться

У меня была проблема с запросом Лукаса. Моя версия mysql не понимала команду TOP. Вместо этого мне пришлось использовать LIMIT. Вот пересмотренный код.

SELECT 
   `id`, 
   (SELECT 
      `id`
    FROM 
       `[*** YOUR TABLE ***]` AS `t2` 
    WHERE 
       `t2`.`left_id`  < `t1`.`left_id`AND 
       `t2`.`right_id` > `t1`.`right_id`
    ORDER BY 
       `t2`.`right_id`-`t1`.`right_id`ASC 
    LIMIT 
       1) AS `parent`
FROM 
    `[*** YOUR TABLE ***]` AS `t1`
WHERE 
    `t1`.`id` = [*** ID OF THE NODE WHOS PARENT YOU WISH TO LOOKUP ***]
ORDER BY 
    `right_id`-`left_id` DESC

Очевидно, поменяйте вещи в [ ], чтобы они соответствовали вашим потребностям. Также удалите [ ]. Этот запрос возвращает только ОДИН ряд. Типа того...

id  parent
7   3
2
ответ дан 3 December 2019 в 01:13
поделиться

TOP - это команда MSSQL, используйте LIMIT для MySQL:

SELECT title, (SELECT title 
       FROM tree t2 
       WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt    
       ORDER BY t2.rgt-t1.rgt ASC
       LIMIT 1) 
AS parent FROM tree t1 
ORDER BY (rgt-lft) DESC

Должно помочь...

17
ответ дан 3 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: