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

Форум MySQL

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

 

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

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

тема: Использование подзапроса в Update
 
 автор: LouD   (28.12.2007 в 12:42)   письмо автору
 
 

Проблема в следующем:
Надо проапдейтить таблицу одну колонку таблицы, отбирая только те строки, которые совпадают со второй таблицей.

Если по-русски :) то это выглядит так:

UPDATE LOW_PRIORITY shopmap_positions    SET position=(position+1) 
       WHERE (
          (position>=1) AND (position<$currPos) 
          AND 
          (id IN (SELECT id FROM shopmap WHERE parent_id=$parentId))
      )

Главная таблица shopmap. Вспомогательная таблица shopmap_positions - поле id у обеих таблиц содержит одинаковые значения (по этому полю они и объединяются).

$currPos и $parentId - понятно, что подставляемые из PHP переменные. Числа. Для конкретики сейчас они имеют значения 2 и 10 соответственно.
Мне надо изменить значение поля position для записей с такими id, у которых в главной таблице поле parent_id имеет строго определенное значение.

Запрос ругается у меня на
You have an error in your SQL syntax near 'SELECT id FROM shopmap WHERE parent_id=10)) ) ' at line 7

Куда копать, господа знатоки?? :)

   
 
 автор: LouD   (28.12.2007 в 13:28)   письмо автору
 
   для: LouD   (28.12.2007 в 12:42)
 

Если я просто указываю список, примерно так:

UPDATE LOW_PRIORITY shopmap_positions    SET position=(position+1)  
       WHERE ( 
          (position>=1) AND (position<$currPos)  
          AND  
          (id IN (11, 15, 23)) 
      )

то все проходит отлично.
Но не хотелось бы отдельно формировать строку-перечень в PHP, организовывать цикл.. Однозначно чувствую, что MySQL имеет встроенные стредства для таких операций, вот только найти не могу :(

   
 
 автор: LouD   (28.12.2007 в 13:42)   письмо автору
 
   для: LouD   (28.12.2007 в 12:42)
 

Коллеги, а не может быть причина вот в такой строке "Версия сервера: 3.23.53-max" ???

Никто не подскажет, с какой версии подзапросы мускул принимает??

А то я уже накрутил еще доп.условий:

UPDATE LOW_PRIORITY shopmap_positions SET position=(position+1) 
WHERE ( (shopmap_positions.id IN (SELECT 
HIGH PRIORITY shopmap.id FROM 
shopmap WHERE shopmap.parent_id=10 FOR 
UPDATE
)) AND (position>=1) AND 
(position<2) )

а может, просто версии не хватает?


P.S. Вообще у меня создается ощущение, что я разговариваю сам с собой тут... :))))

   
 
 автор: LouD   (28.12.2007 в 13:51)   письмо автору
 
   для: LouD   (28.12.2007 в 13:42)
 

ну что - сам себе отвечу:
> Version 4.1 of the MySQL server includes many enhancements and new features:
> * Subqueries and derived tables (unnamed views). See Section 12.2.8, “Subquery Syntax” (http://dev.mysql.com/doc/refman/4.1/en/subqueries.html)

Вот и поговорили! :)

Итого резюме, как я понимаю:
- тему можно закрывать
- проблема лишь в старой версии мускула, синтаксис запроса правильный.

   
 
 автор: Trianon   (29.12.2007 в 04:17)   письмо автору
 
   для: LouD   (28.12.2007 в 13:42)
 

>Версия сервера: 3.23.53-max

:))

   
 
 автор: LouD   (29.12.2007 в 10:11)   письмо автору
 
   для: Trianon   (29.12.2007 в 04:17)
 

Ну и ладно прикалываться! :))))

Зато обновился вот - повод появился наконец! ;)

   
Rambler's Top100
вверх

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