|
MySQL.RU - Webboard
Вернуться
Потеря связи с родителем (BrownFurry) 29/02/2016 - 12:14:19
Re: Потеря связи с родителем (BrownFurry) 29/02/2016 - 17:08:24
Re: Потеря связи с родителем (Akina) 01/03/2016 - 09:28:25
> Original message text:
> From: BrownFurry - 29/02/2016 - 12:14:19
> Subject:Потеря связи с родителем
> -----------------
> Добрый день. Не погу понять, откуда растут ноги с такой проблемой:
>
> Есть таблица, в которой элементы с древовидной иерархией, типа:
>
> CREATE TABLE IF NOT EXISTS `items` (
> `ID` bigint(20) NOT NULL AUTO_INCREMENT,
> `ParentID` bigint(20) DEFAULT NULL,
> ...
> PRIMARY KEY (`ID`)
> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
>
> где ParentID - ID родительского элемента из этой же таблицы. И есть запрос, который по ID элемента возвращает список всех его родителей до рута:
>
> SELECT ID, @pv:=ParentID as ParentID, ...
> FROM (SELECT * FROM items ORDER by ID DESC) t2
> JOIN (SELECT @pv: = (?) ) tmp
> WHERE ID=@pv;
>
> Запрос рабочий и возвращает все, что надо.
>
> Но вот стоит только любым способом изменить содержимое ParentID (не только UDATE, даже удалял таблицу и заливал дамп с новым значением), как запрос возвращает только сам элемент с ID из запроса и ни одного родителя. Причем если поменять родительский ИД на любой из в цепочке родителей, то возвращает от этого родителя и выше.
>
> Уже сломал всю голову, что может такого происходить. Думал, может где кэшируется предыдущие выборки так, что хранит перечень значений и не возвращает ничего, если их не находит. Или еще что. так что ничего не нагуглил.
>
> Поэтому надеюсь на вас, может знаете, чем такое может быть вызвано и куда копать?
>
From: Akina - 01/03/2016 - 09:28:25
Subject:Потеря связи с родителем
-----------------
> В результате экспериментов выяснил, что дело не в магии переменных. Просто текущий запрос работает только если ID родителя меньше ID текущего.
Ошибаетесь. "Магия переменных" тут как раз и работает. Точнее, непонимание, как именно она работает. Фактически Вы пытаетесь строить рекурсивный запрос поверх однократного фуллскана таблицы - отсюда и итог. Т.е. фактически Вы работаете с курсором.
Если в структуре есть поле текущего уровня узла - формально достаточно в подзапросе изменить ORDER by ID DESC на ORDER by LEVEL DESC. Но правильнее заменить запрос (формально иногда работающий, но фактически неправильный) на рекурсивную ХП, либо изменить структуру хранения (оптимум - на специально заточенную под деревья, по минимуму - добавить поле полного пути в дереве).
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
43498
|
|