Заметьте, что прежде, чем вызвать размещение new
, необходимо назвать деструктор на памяти †“, по крайней мере, если объект или имеет нетривиальный деструктор или содержит участников, которые имеют.
Для объектного указателя obj
из класса Foo
деструктор можно явно назвать следующим образом:
obj->~Foo();
Посмотрите на этот вопрос . Он похож на ваш. Я отправил туда запрос, который может вам понадобиться.
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
Все предки возвращаются
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
У меня была проблема с запросом Лукаса. Моя версия 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
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
Должно помочь...