SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.02.2016 18:01:30

BrownFurry
Участник
Зарегистрирован: 25.02.2016
Сообщений: 4

Потеря связи с родителем

Добрый день. Не погу понять, откуда растут ноги с такой проблемой:

Есть таблица, в которой элементы с древовидной иерархией, типа:

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 из запроса и ни одного родителя. Причем если поменять родительский ИД на любой из в цепочке родителей, то возвращает от этого родителя и выше.

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

Поэтому надеюсь на вас, может знаете, чем такое может быть вызвано и куда копать?

Отредактированно BrownFurry (25.02.2016 18:02:08)

Неактивен

 

#2 25.02.2016 22:28:04

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Потеря связи с родителем

вы неправильно используете переменные, поэтому у вас такие нестабильные результаты
посмотрите http://sqlinfo.ru/forum/viewtopic.php?id=1742

Неактивен

 

#3 26.02.2016 16:20:55

BrownFurry
Участник
Зарегистрирован: 25.02.2016
Сообщений: 4

Re: Потеря связи с родителем

vasya написал:

вы неправильно используете переменные, поэтому у вас такие нестабильные результаты
посмотрите http://sqlinfo.ru/forum/viewtopic.php?id=1742

Посмотрел тему, примеры и ссылки с нее. Честно говоря, не понял по тому материалу, что не так у меня здесь. Все-таки ситуация обратная - надо от дочернего выбрать все родительские.
Вы можете сказать, что конкретно я использую не так и как нужно это исправить?

Неактивен

 

#4 27.02.2016 00:41:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Потеря связи с родителем

вы используете переменные в части where
тот факт, что запрос иногда работает не более чем случайность
а в последних версиях, где упрощаются тривиальные from-подзапросы, он гарантированно работать не будет

к сожалению, переменные имеют целый ряд ограничений и вашу задачу так не решить.

Неактивен

 

#5 29.02.2016 12:03:55

BrownFurry
Участник
Зарегистрирован: 25.02.2016
Сообщений: 4

Re: Потеря связи с родителем

vasya написал:

вы используете переменные в части where
тот факт, что запрос иногда работает не более чем случайность

По ссылке, где переместили переменные из WHERE, запрос изначально возвращал не то, что хотелось изначально. Здесь запрос изначально все возвращал, но только для свежедобавленных записей. Поэтому у меня возникла мысль о кэшировании такого запроса. Как будто где-то при первом запросе сохраняется эта связь child-parent.

vasya написал:

где упрощаются тривиальные from-подзапросы

Можете подсказать ссылку, где про это прочитать можно?

vasya написал:

к сожалению, переменные имеют целый ряд ограничений и вашу задачу так не решить.

Можете подсказать какой-то путь решения проблемы?

Неактивен

 

#6 29.02.2016 17:05:16

BrownFurry
Участник
Зарегистрирован: 25.02.2016
Сообщений: 4

Re: Потеря связи с родителем

В результате экспериментов выяснил, что дело не в магии переменных. Просто текущий запрос работает только если ID родителя меньше ID текущего. Вот тут не работает
http://sqlfiddle.com/#!9/f0a88/1
Если в базе поменять где стоит 20 на что-то меньше 15, то прекрасно все работает.

Запрос "достался в наследство" от предыдущего разраба. При реальном запуске системы сейчас вот такое и всплыло. Почитал на Хабре статьи про разную организацию иерархии, буду думать.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson