Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: сложный UPDATE

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
QuadMan
Отправлено: 31 Июля, 2008 - 20:12:05
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2008  


Помог: 0 раз(а)




Помогите, пожалуйста составить правильный UPDATE.
Нужно, чтобы поле ONTOP стало равно '1' у элемента с ID=36 и у всех элементов таблицы с таким же полем DOCNAME. smile.gif
Вроде не очень сложно, но не получается...

CODE (text):
скопировать код в буфер обмена
  1.  
  2. UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` = (SELECT `DOCNAME` FROM `DOCUMENTS` WHERE `ID` = '36')
  3.  


Спасибо!
 
 Top
UA.ProG
Отправлено: 31 Июля, 2008 - 21:40:08
Post Id



Частый гость


Покинул форум
Сообщений всего: 171
Дата рег-ции: Июль 2008  
Откуда: Николаев,Украина


Помог: 0 раз(а)

[+]


Напиши что за ошибка а там уже поймем а то так не очень понять


-----
--------------MoZG--------------
---------Google спасёт мир------
 
 Top
QuadMan
Отправлено: 31 Июля, 2008 - 22:44:32
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2008  


Помог: 0 раз(а)




UA.ProG пишет:
Напиши что за ошибка а там уже поймем а то так не очень понять


MySQL пишет: #1093 - You can't specify target table 'DOCUMENTS' for update in FROM clause

Недовольство, огорчение похоже, нельзя использовать таблицу в подзапросе, если она используется для UPDATE...
 
 Top
_kT
Отправлено: 01 Августа, 2008 - 09:33:47
Post Id



Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Июль 2008  
Откуда: Новокузнецк


Помог: 0 раз(а)




Раздели на 2 запроса.


-----
http://www[dot]razbor[dot]org/ - б/у автозапчасти
 
 Top
QuadMan
Отправлено: 01 Августа, 2008 - 10:12:30
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2008  


Помог: 0 раз(а)




_kT пишет:
Раздели на 2 запроса.

Если не получится одним запросом, конечно, придется разделять... но все-же хотелось понять, можно ли это реализовать одним запросом..
 
 Top
UA.ProG
Отправлено: 01 Августа, 2008 - 10:15:52
Post Id



Частый гость


Покинул форум
Сообщений всего: 171
Дата рег-ции: Июль 2008  
Откуда: Николаев,Украина


Помог: 0 раз(а)

[+]


Вот как надо формировать такие запросы

CODE (text):
скопировать код в буфер обмена
  1. -- Create Table
  2. ----------------------------------
  3. CREATE TABLE t_sipa_stato (
  4.   COD_SIPA       varchar(12) NOT NULL default '',
  5.   COD_LATO       char(1)     NOT NULL default '',
  6.   COD_BOTTIGLIA  varchar(12)          default NULL,
  7.   FLG_ANOMALIA   tinyint(1)  NOT NULL default '0',
  8.   PRIMARY KEY  (COD_SIPA,COD_LATO),
  9.   KEY IDX_LATI_BOTTIGLIA (COD_BOTTIGLIA),
  10. ) ENGINE=InnoDB;
  11.  
  12. CREATE TABLE t_bottiglie (
  13.   COD_BOTTIGLIA  varchar(12) NOT NULL default '',
  14.   DES_BOTTIGLIA  varchar(50) NOT NULL default '',
  15.   COD_COLORE     varchar(5)           default NULL,
  16.   PRIMARY KEY  (COD_BOTTIGLIA),
  17. ) ENGINE=InnoDB;
  18.  
  19. ----------------------------------
  20. -- Update Test
  21. ----------------------------------
  22.  
  23. Update T_BOTTIGLIE Inner join T_SIPA_STATO On T_BOTTIGLIE.COD_BOTTIGLIA =
  24. T_SIPA_STATO.COD_BOTTIGLIA
  25. Set T_SIPA_STATO.FLG_ANOMALIA = 1
  26. Where Exists
  27. ( Select *
  28.     from T_BOTTIGLIE As BOTT Inner join T_SIPA_STATO As STAT On BOTT.COD_BOTTIGLIA =
  29. STAT.COD_BOTTIGLIA
  30.    Where T_SIPA_STATO.COD_SIPA = STAT.COD_SIPA And T_SIPA_STATO.COD_LATO <> STAT.COD_LATO
  31.    And T_BOTTIGLIE.COD_COLORE <> BOTT.COD_COLORE
  32. )


-----
--------------MoZG--------------
---------Google спасёт мир------
 
 Top
Lostoffuture
Отправлено: 01 Августа, 2008 - 10:17:31
Post Id



Гость


Покинул форум
Сообщений всего: 95
Дата рег-ции: Июль 2008  
Откуда: обнинск


Помог: 0 раз(а)

[+]


Цитата:
Если не получится одним запросом, конечно, придется разделять... но все-же хотелось понять, можно ли это реализовать одним запросом..



CODE (text):
скопировать код в буфер обмена
  1. UPDATE DOCUMENTS SET ONTOP = 1 WHERE ID = '36' OR DOCNAME = (SELECT DOCNAME FROM DOCUMENTS WHERE ID = '36')


пробуй без наклонных, у меня все update без ковычек


-----
Не пользуйтесь денверами, делайте сами связки)))))
 
 Top
UA.ProG
Отправлено: 01 Августа, 2008 - 10:22:21
Post Id



Частый гость


Покинул форум
Сообщений всего: 171
Дата рег-ции: Июль 2008  
Откуда: Николаев,Украина


Помог: 0 раз(а)

[+]


Не понял

(Отредактировано автором: 01 Августа, 2008 - 10:24:19)



-----
--------------MoZG--------------
---------Google спасёт мир------
 
 Top
Lostoffuture
Отправлено: 01 Августа, 2008 - 10:25:25
Post Id



Гость


Покинул форум
Сообщений всего: 95
Дата рег-ции: Июль 2008  
Откуда: обнинск


Помог: 0 раз(а)

[+]


Язычок


Отредактировано модератором: EuGen, 01 Августа, 2008 - 15:56:39
Предупреждение за флуд


-----
Не пользуйтесь денверами, делайте сами связки)))))
 
 Top
Champion Супермодератор
Отправлено: 28 Августа, 2008 - 15:21:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




WHERE `ID` = '36' OR `DOCNAME` = (SELECT `DOCNAME` FROM `DOCUMENTS` WHERE `ID` = '36')

А какой смысл? Часть запроса после OR всегда будет истина. кажется. И неплохо бы select first 1... или docname in (select...
 
 Top
pifon1989
Отправлено: 28 Августа, 2008 - 15:36:24
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Champion пишет:
И неплохо бы select first 1... или docname in (select...

Однако
Интересно. Пример!


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Champion Супермодератор
Отправлено: 02 Сентября, 2008 - 12:01:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Цитата:
Интересно. Пример!


UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` = (SELECT FIRST 1 `DOCNAME` FROM `DOCUMENTS` where таким же полем DOCNAME )

UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` in (SELECT `DOCNAME` FROM `DOCUMENTS` where таким же полем DOCNAME )

только я не совсем понял фразу "таким же полем DOCNAME". Таким же как что?
(Добавление)
ААА, понял! либо id 36, либо dockname такой же, как один из тех, что с id 36?
Тогда вот:
UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` = (SELECT FIRST 1 `DOCNAME` FROM `DOCUMENTS` where id = 36)

UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` in (SELECT `DOCNAME` FROM `DOCUMENTS` where id = 36 )

По поводу того, что часть запроса всегда true - вроде я ошибся
 
 Top
pifon1989
Отправлено: 02 Сентября, 2008 - 13:20:24
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` = (SELECT FIRST 1 `DOCNAME` FROM `DOCUMENTS` where id = 36)
  3.  
  4. UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` in (SELECT `DOCNAME` FROM `DOCUMENTS` where id = 36 )
  5.  
  6. По поводу того, что часть запроса всегда true - вроде я ошибся
  7.  

Любопытный пример, надо будет взять на заметку. Улыбка SQL вообще то язык довольно простой, пока дело до триггеров не доходит Язычок


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
EuGen Администратор
Отправлено: 02 Сентября, 2008 - 17:45:47
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
pifon1989
Отправлено: 02 Сентября, 2008 - 18:24:01
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Тьфу. Никак не пойму, что за дикий запрос и в чём суть, хоть убейте.
Итак.
1. Есть таблица с именем DOCUMENTS;
2. В ней есть ячейка под названием ONTOP;
3. В каждой строке есть ID-указатель, на который мы и опираемся;
4. Так вот в той строке, где ID равен 36, мы устанавливаем новое значение ONTOP;
5. Но с момента OR начинается полная тупня, как не назови - одно:
а.) Мы говорим базе: в строк(е/ах), где ID равен 36 или некое поле, именуемое DOCNAME, - что оно? 0.о
Оно находится в таблице, в строке, где ID равно 36??? Как это может быть?
Нет, вдумайтесь, - мы меняем значение поля ONTOP там, где ID равно 36 или есть поле DOCNAME, у которого ID в строке равно 36. Во-первых, вопрос: нафига это надо? Если самого ID нет, второй вариант неверен, поскольку уже по определению поля DOCNAME с ID равным 36 быть не может.
Иными словами, мы говорим: если 2+3 = 5 или 3+2 = 5, то.
б.) Мы посылаем офигенски умный запрос: не "или существует DOCNAME, в строке у которого ID равен 36", как скорее всего было задумано, а "существует DOCNAME, в (извлеки DOCNAME из DOCUMENTS, где ID равно 36)". Т.е. мы ищем DOCNAME в DOCNAME, в строке которого ID = 36.
в.) Может быть, конечно, всем всё в этом запросе понятно, но мне в нём ничего не понятно. В нём ни смысла, ни простейшей логики запроса.

P.S.: И ошибка, которую привёл товарисч
PHP:
скопировать код в буфер обмена
  1.  
  2. #1093 - You can't specify target table 'DOCUMENTS' for update in FROM clause
  3. // что-то вроде
  4. #1093 - Вы не можете установить целью таблицу DOCUMENTS для обновления в разделе FROM
  5.  

Это то тут причём O.O
Возникает резонный вопрос: а DOCUMENTS ВООБЩЕ ТАБЛИЦА??? 0.о

Если поймёте ход моих рассуждений, прокомментируйте пожалуйста, а то я уже и не знаю, что про себя думать. Улыбка


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB