Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Мир вашему дому, Уважаемые!
Я, пока, не волшебник, а только учусь, поэтому прошу помощи...
Взял код из этой статьи: Хранение и алгоритмы работы с ориентированными ациклическими графами в БД
Пытался его адаптировать к MySQL 5...
Так вот, с кодом /* Определение поля Link для добавленных записей */ ничего не получается: то "синтаксис не тот", то "такой таблицы не существует" ([VartexId] исправил). Возможно ли в MySQL реализовать такой код?
Заранее благодарен.
Неактивен
Безусловно можно реализовать. Пожалуйста приведите конкретные запросы, которые вызывают ошибки и какие ошибки возникают.
Неактивен
Если код в таком виде (конечно, без квадратных скобок), то, сразу, в этой строчке from [tMembership] as [t]
where [t].[ParentId] = [tMembership].[ParentId] - неправильный синтаксис (точно не помню - БД на работе).
Неактивен
Вообщем, если пишу update [tMembership] set [Link] = [t].[Id] from [tMembership] as [t] where [t].[ParentId] = [tMembership].[ParentId] and [t].[VertexId] in... - неправильный синтаксис;
если update [tMembership], [tMembership] as [t] set [tMembership].[Link] = [t].[Id] where [t].[ParentId] = [tMembership].[ParentId] and [t].[VertexId] in (select [ParentId] from [tMembership] as [t1] where [t1].[VertexId] = [tMembership].[VartexId] and [Link] is null and [ParentId] in (select [VertexId] from [tMembership] as [t2] where [t2].[ParentId] = [tMembership].[ParentId])... - нельзя использовать update в from;
если update [tMembership], [tMembership] as [t], [tMembership] as [t1], [tMembership] as [t2] set [tMembership].[Link] = [t].[Id] where [t].[ParentId] = [tMembership].[ParentId] and [t].[VertexId] in (select [ParentId] from [t1] where [t1].[VertexId] = [tMembership].[VartexId] and [Link] is null and [ParentId] in (select [VertexId] from [t2] where [t2].[ParentId] = [tMembership].[ParentId])... - таблица t1 не существует...
Неактивен
Код, который у Вас приведен, это блок-схема, иллюстрирующая алгоритм. В данном случае, например, квадратные скобки неуместны. Не забудьте создать соответствующие таблицы.
Неактивен
Да, конечно. Таблицы созданы, квадратные скобки опущены...
Неактивен
MySQL поддерживает только часть стандарта SQL. Некоторые конструкции могут не поддерживаться, а некоторые требуют другого синтаксиса. Для упрощения, приведите sql-запросы без квадратных скобок и структуру таблиц. (SHOW CREATE TABLE tMembership).
Неактивен
Хорошо, спасибо. Но это завтра. БД на работе (а у меня - первый час ночи...).
Неактивен
Структура:
CREATE TABLE `membership` (\n `ID` smallint(5) unsigned NOT NULL auto_increment,\n `ParentID` smallint(5) unsigned NOT NULL,\n `VertexID` smallint(5) unsigned NOT NULL,\n `Link` smallint(5) unsigned default NULL,\n PRIMARY KEY (`ID`),\n UNIQUE KEY `ParentID` (`ParentID`,`VertexID`)\n) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=cp1251
Этот код работает:
/* Первый этап – создание непосредственной связи */ $query = "INSERT IGNORE INTO membership Values (NULL, '$rubrika', '$podrubrika', NULL)"; /* Второй этап – создание связей с родительскими вершинами i-й вершины */ $query = "INSERT INTO membership (`ParentId`, `VertexId`, `Link`) SELECT `ParentId`, '$podrubrika' as `VertexId`, `ID` AS `Link` FROM `membership` WHERE `VertexId` = '$rubrika'"; /* Третий этап – добавление связей между i-й вершиной, ее родителями и дочерними элементами j-й вершины */ $query = "INSERT INTO membership (`ParentId`, `VertexId`, `Link`) SELECT `t1`.`ParentId`, `t2`.`VertexId`, NULL AS `Link` FROM `membership` AS `t1`, `membership` AS `t2` WHERE `t1`.`VertexId` = '$rubrika' AND `t2`.`ParentId` = '$podrubrika'"; $query = "INSERT INTO membership (`ParentId`, `VertexId`, `Link`) SELECT '$rubrika' AS `ParentId`, `VertexId`, NULL AS `Link` FROM `membership` WHERE `ParentId` = '$podrubrika'";
Этот не работает:
/* Определение поля Link для добавленных записей */ $query = "UPDATE `membership` SET `Link` = `t`.`ID` FROM `membership` AS `t` WHERE `membership`.`ParentId` = `t`.`ParentId` AND `t`.`VertexId` IN ( SELECT `ParentId` FROM `membership` AS `t1` WHERE `t1`.`VertexId` = `membership`.`VertexId` AND `Link` IS NULL AND `ParentId` IN ( SELECT `VertexId` FROM `membership` AS `t2` WHERE `t2`.`ParentId` = `membership`.`ParentId` )) AND ( `membership`.`ParentId` = '$rubrika' OR `membership`.`ParentId` IN ( SELECT `ParentId` FROM `membership` WHERE `VertexId` = '$rubrika' )) AND `membership`.`VertexId` IN ( SELECT `ParentId` FROM `membership` WHERE `ParentId` = '$podrubrika' )"; Ответ MySQL: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM `membership` AS `t` WHERE `membership`.`ParentId` = `t`.`ParentId` AND `t`' at line 1
Неактивен
Вы используете подзапрос, но забыли ключевое слово SELECT
SET `Link` = (SELECT `t`.`ID` FROM `membership` AS `t`
Неактивен
Я так делал:
Ответ MySQL:
#1054 - Unknown column 't.ParentId' in 'where clause'
Неактивен
SET `Link` = `t`.`ID` FROM `membership` AS `t`
WHERE `membership`.`ParentId` = `t`.`ParentId`
вот в этом куске не вижу осмысленности.
#1054 - Unknown column 't.ParentId' in 'where clause' - нет такой колонки.
--
Попробуйте написать запрос, который Вы запускаете, тогда будет понятно, что за ошибка.
Неактивен
Как я понял, в MySQL невозможно одним запросом реализовать такой код (нельзя в одном запросе обращаться к одной и той же таблице, в моём случае - `membership`, с предложениями UPDATE и SELECT FROM), или я не прав? Поэтому разбил на два запроса и реализовал с помощью PHP, но это, наверное, скажется на быстродействии, - или я, опять, не прав?
Спасибо всем ответившим.
Отредактированно Vadanok (22.02.2008 15:51:38)
Неактивен
Страниц: 1