SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 21.02.2008 16:36:25

Vadanok
Участник
Откуда: Хабаровский край
Зарегистрирован: 21.02.2008
Сообщений: 8

Прошу помощи... Возможно ли в MySQL реализовать такой код?

Мир вашему дому, Уважаемые!
Я, пока, не волшебник, а только учусь, поэтому прошу помощи...

Взял код из этой статьи: Хранение и алгоритмы работы с ориентированными ациклическими графами в БД
Пытался его адаптировать к MySQL 5...
Так вот, с кодом /* Определение поля Link для добавленных записей */ ничего не получается: то "синтаксис не тот", то "такой таблицы не существует" ([VartexId] исправил). Возможно ли в MySQL реализовать такой код?
Заранее благодарен.

Неактивен

 

#2 21.02.2008 16:39:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

Безусловно можно реализовать. Пожалуйста приведите конкретные запросы, которые вызывают ошибки и какие ошибки возникают.

Неактивен

 

#3 21.02.2008 16:47:07

Vadanok
Участник
Откуда: Хабаровский край
Зарегистрирован: 21.02.2008
Сообщений: 8

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

Если код в таком виде (конечно, без квадратных скобок), то, сразу, в этой строчке from [tMembership] as [t]
where [t].[ParentId] = [tMembership].[ParentId]
- неправильный синтаксис (точно не помню - БД на работе).

Неактивен

 

#4 21.02.2008 17:12:06

Vadanok
Участник
Откуда: Хабаровский край
Зарегистрирован: 21.02.2008
Сообщений: 8

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

Вообщем, если пишу 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 не существует...

Неактивен

 

#5 21.02.2008 17:14:14

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

Код, который у Вас приведен, это блок-схема, иллюстрирующая алгоритм. В данном случае, например, квадратные скобки неуместны. Не забудьте создать соответствующие таблицы.

Неактивен

 

#6 21.02.2008 17:16:35

Vadanok
Участник
Откуда: Хабаровский край
Зарегистрирован: 21.02.2008
Сообщений: 8

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

Да, конечно. Таблицы созданы, квадратные скобки опущены...

Неактивен

 

#7 21.02.2008 17:20:48

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

MySQL поддерживает только часть стандарта SQL. Некоторые конструкции могут не поддерживаться, а некоторые требуют другого синтаксиса. Для упрощения, приведите sql-запросы без квадратных скобок и структуру таблиц. (SHOW CREATE TABLE tMembership).

Неактивен

 

#8 21.02.2008 17:24:34

Vadanok
Участник
Откуда: Хабаровский край
Зарегистрирован: 21.02.2008
Сообщений: 8

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

Хорошо, спасибо. Но это завтра. БД на работе (а у меня - первый час ночи...).

Неактивен

 

#9 22.02.2008 02:50:16

Vadanok
Участник
Откуда: Хабаровский край
Зарегистрирован: 21.02.2008
Сообщений: 8

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

Структура:

Код:

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

Неактивен

 

#10 22.02.2008 03:58:09

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

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

Вы используете подзапрос, но забыли ключевое слово SELECT

SET `Link` = (SELECT `t`.`ID` FROM `membership` AS `t`

Неактивен

 

#11 22.02.2008 04:34:39

Vadanok
Участник
Откуда: Хабаровский край
Зарегистрирован: 21.02.2008
Сообщений: 8

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

Я так делал:

Ответ MySQL:
#1054 - Unknown column 't.ParentId' in 'where clause'

Неактивен

 

#12 22.02.2008 14:49:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

SET `Link` = `t`.`ID` FROM `membership` AS `t`
WHERE `membership`.`ParentId` = `t`.`ParentId`

вот в этом куске не вижу осмысленности.

#1054 - Unknown column 't.ParentId' in 'where clause' - нет такой колонки.

--

Попробуйте написать запрос, который Вы запускаете, тогда будет понятно, что за ошибка.

Неактивен

 

#13 22.02.2008 15:50:09

Vadanok
Участник
Откуда: Хабаровский край
Зарегистрирован: 21.02.2008
Сообщений: 8

Re: Прошу помощи... Возможно ли в MySQL реализовать такой код?

Как я понял, в MySQL невозможно одним запросом реализовать такой код (нельзя в одном запросе обращаться к одной и той же таблице, в моём случае - `membership`, с предложениями UPDATE и SELECT FROM), или я не прав? Поэтому разбил на два запроса и реализовал с помощью PHP, но это, наверное, скажется на быстродействии, - или я, опять, не прав?
Спасибо всем ответившим.

Отредактированно Vadanok (22.02.2008 15:51:38)

Неактивен

 

Board footer

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