Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с вложенным многотабличным запросом
 
 автор: denvor   (27.08.2008 в 15:05)   письмо автору
 
 

Не работает вот такой запрос:

UPDATE modx_site_content SET id=27 WHERE id IN
(SELECT modx_site_content.id
  FROM modx_site_content, modx_site_tmplvar_contentvalues
  WHERE parent =12
  AND deleted =0
  AND published =1
  AND tmplvarid =6
  AND contentid = modx_site_content.id
  ORDER BY modx_site_content.id 
  LIMIT 5,30
)

говорит: #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Однако же, если UPDATE меняю на SELECT - все работает. Ладно, выкинул пока LIMIT :
UPDATE modx_site_content SET id=27 WHERE id IN
(SELECT modx_site_content.id
  FROM modx_site_content, modx_site_tmplvar_contentvalues
  WHERE parent =12
  AND deleted =0
  AND published =1
  AND tmplvarid =6
  AND contentid = modx_site_content.id
  ORDER BY modx_site_content.id
)

говорит: #1093 - You can't specify target table 'modx_site_content' for update in FROM clause

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

  Ответить  
 
 автор: ronin   (27.08.2008 в 15:27)   письмо автору
 
   для: denvor   (27.08.2008 в 15:05)
 

может меня товарищи поправят, но update не может быть в одной конструкции с select.

  Ответить  
 
 автор: Trianon   (27.08.2008 в 15:54)   письмо автору
 
   для: denvor   (27.08.2008 в 15:05)
 

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

  Ответить  
 
 автор: denvor   (27.08.2008 в 17:54)   письмо автору
 
   для: Trianon   (27.08.2008 в 15:54)
 

С первичным ключом - это опечатка, обновляется другое поле
UPDATE modx_site_content 
SET    parent = '27' 
WHERE  id IN
 (SELECT modx_site_content.id
  FROM modx_site_content, modx_site_tmplvar_contentvalues
  WHERE parent =12
  AND deleted =0
  AND published =1
  AND tmplvarid =6
  AND contentid = modx_site_content.id
  ORDER BY modx_site_content.id
  LIMIT 5,10)


А вот насчет SELECT в UPDATE действительно хотелось бы услышать :) В книге написано, что внутренним запросом может быт только SELECT , а внешним - все (включая UPDATE )... Копаем...

  Ответить  
 
 автор: Trianon   (27.08.2008 в 18:02)   письмо автору
 
   для: denvor   (27.08.2008 в 17:54)
 

и что означает ORDER и LIMIT во внутреннем запросе?

ORDER и LIMIT воздействуют на формирование набора результата (для SELECT)
Здесь же SELECT никакой результат не порождает.

  Ответить  
 
 автор: Trianon   (27.08.2008 в 18:04)   письмо автору
 
   для: Trianon   (27.08.2008 в 18:02)
 

Остальное я бы написал через соединение

UPDATE modx_site_content 
FROM modx_site_content 
    JOIN modx_site_tmplvar_contentvalues ON contentid = modx_site_content.id
SET    parent = '27'  
WHERE  parent =12
  AND deleted =0
  AND published =1
  AND tmplvarid =6

  Ответить  
 
 автор: denvor   (27.08.2008 в 19:45)   письмо автору
 
   для: Trianon   (27.08.2008 в 18:02)
 

SELECT во внутреннем запросе выдает список id. Для их сортировки и отсечения нужного диапазона и применяю SORT и LIMIT

UPDATE ... FROM наверное не совсем верно
выдает #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 modx_site_content
JOIN modx_site_tmplvar_contentvalues ON contentid =' at line 2

  Ответить  
 
 автор: Trianon   (27.08.2008 в 20:02)   письмо автору
 
   для: denvor   (27.08.2008 в 19:45)
 

>SELECT во внутреннем запросе выдает список id. Для их сортировки и отсечения нужного диапазона
и применяю SORT и LIMIT

Для этого применяется AND modx_site_content.id BETWEEN 5 AND 24 в разделе WHERE


>UPDATE ... FROM наверное не совсем верно

Какая версия сервера?
Впрочем, да. Это я с DELETE перепутал

UPDATE modx_site_content
JOIN modx_site_tmplvar_contentvalues
ON

и далее по тексту

  Ответить  
 
 автор: denvor   (28.08.2008 в 00:38)   письмо автору
 
   для: Trianon   (27.08.2008 в 20:02)
 

Версия MySQL - 5 с копейками.

Вот примерно такого совета я и ожидал :) (с JOIN не работал пока) - завтра попробую и доложу. Спасибо!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования