Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2011, 21:45   #1
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию Групповое обновление. Как лучше сделать?

Имеется массив id записей таблицы tab. Нужно у этих записей обновить поле count. Пример:
id массив: 2, 12, 1, 3, 3, 3, 1

Я делаю так:
Код:
'UPDATE `tab` SET `count`=`count`-1 WHERE `id` IN (2, 12, 1, 3, 3, 3, 4);');
Но так не правильно, т.к. обновляется только на 1, а т.к. у нас имеется id=3 три раза, значит должно обновиться это поле на 3. Массив может меняться, могут быть одинаковые id, а могут быть и все разные. Сам вопрос, как это лучше сделать, или придётся разными запросами делать?
dr.Chas вне форума Ответить с цитированием
Старый 13.07.2011, 23:03   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Формировать строку IN выбирая только не повторяющиеся и одновременно удаляя из массива выбранные. Выполить запрос и по-новой формирование строки IN из остатка массива и т.д. Для приведенного примера получится три UPDATE. Одним запросом можно в set CASE WHEN использовать, но эту строчку прийдется программно сформировать тогда. Не знаю приемлимо ли это:
Код:
UPDATE 'tab'
   SET 'count'='count' - CASE WHEN 'id'=3 THEN 3 ELSE 1 END
   WHERE 'id' IN (2, 12, 1, 3, 4);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.07.2011, 23:03   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да... задачка...

СУБД у Вас какая? судя по кавычкам MySQL ?
вариант с хранимой процедурой не рассматривали?

Теоретически можно занести все ID в таблицу (или подзапрос)
и обновлять
Код:
'UPDATE `tab` SET `count`=`count`- (select count(*) from ТаблицаСНаборомID where ТаблицаСНаборомID.ID = tab.ID)
where tab.id in (select ID from ТаблицаСНаборомID)
но я не уверен, что ваша СУБД "скушает" такой синтаксис..


_______________
Добавлено.


Аватар, с CASE красивый вариант - мне понравилось!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2011, 23:34   #4
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
да... задачка...
Согласен, интересная. У самого есть пару вариантов тоже, но я думаю они не оптимальные, т.к. с SQL ещё не до конца познакомился.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
СУБД у Вас какая? судя по кавычкам MySQL ?
Да. ЯП php.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вариант с хранимой процедурой не рассматривали?
Подумаю над этим

Завтра (сегодня уже поздно), попробую предложенные варианты. Если у кого ещё есть идеи по поводу этого пишите.

Последний раз редактировалось dr.Chas; 13.07.2011 в 23:36.
dr.Chas вне форума Ответить с цитированием
Старый 14.07.2011, 08:17   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Завтра (сегодня уже поздно), попробую предложенные варианты.
Если допустимо формирование строчки кода в runtime (а скорее всего, это возможно, ведь список ID как-то появляется),
то я бы рекомендовал начать с варианта, предложенного Аватар.
Он, конечно, заставит программиста попотеть, но от сервера в данном случае вообще ничего не требуется (кроме поддержки CASE в операции Update, разумеется!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.07.2011, 09:53   #6
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Спасибо всем. Воспользовался примером Аватар. Всё получилось + узнал новую конструкцию
dr.Chas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с image хз как лучше сделать. winner13 Мультимедиа в Delphi 3 25.04.2011 09:42
Программа с локазизацией. Как можно сделать лучше? exploys Общие вопросы C/C++ 0 12.04.2011 17:05
Как лучше сделать форму редактирования таблицы ? Allan Stark Microsoft Office Access 15 09.02.2011 22:30
Как сделать групповое удаление, а не по одному за щелчок. Bushel PHP 6 22.11.2010 12:02
Подскажите как лучше сделать Gendolff БД в Delphi 1 10.02.2007 08:47