Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UPDATE нескольких строк, обновление нескольких строк таблиц 
V
    Опции темы
zhpasha
Дата 6.11.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.2.2008

Репутация: нет
Всего: нет



Опишу в начале задачу, которая стоит передо мной.

Имеется страница редактирования, допустим редактирования новостей. На странице N штук новостей. Все эти N новостей находятся в одной форме, соответственно при редактирование, отправка ВСЕХ данных этой формы производится одной кнопкой. В итоге, одновременному редактированию могут подвергнуться сразу несколько новостей. Картина, я надеюсь, ясна.

Теперь у меня возникает следующая проблема. 

Таблица новостей:
id | title | text | visible | 

Мне необходимо (в идеале одним запросом) выполнить UPDATE сразу нескольких строк этой таблицы. Причём поля в них меняться могут разные и значения принимать разные.

P.C. Пока вижу только два способа. Оба из них отпадают:
1. Составить по полученным из формы данным m запросов.. Но насколько я понимаю, одним шагом их по средствам php не выполнить?!
2. Отпадает не успев появиться - пустить запрос в цикле.

Возможно ли как-то "изящно" решить этот вопрос?
PM MAIL   Вверх
lelik133
Дата 6.11.2008, 17:10 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 517
Регистрация: 5.2.2003
Где: Москва

Репутация: 3
Всего: 14



хм.. а зачем редактировать сразу 5 новостей...
можно сделать список новостей с кнопочкой редактировать напротив каждой, и выводить форму редактирования только для одной новости..
PM ICQ   Вверх
zhpasha
Дата 6.11.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.2.2008

Репутация: нет
Всего: нет



Цитата

можно сделать список новостей с кнопочкой редактировать напротив каждой, и выводить форму редактирования только для одной новости..


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

Если задача технически грамотно никак не реализуется, то придется делать именно так, что очень не хочелось бы(
PM MAIL   Вверх
lelik133
Дата 6.11.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 517
Регистрация: 5.2.2003
Где: Москва

Репутация: 3
Всего: 14



а чем тебе не нравиться несколько update запросов, зачем тебе делать их именно одним запросом?
PM ICQ   Вверх
skyboy
Дата 6.11.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(zhpasha @  6.11.2008,  16:24 Найти цитируемый пост)
Если задача технически грамотно никак не реализуется

первоначальный подход чреват граблями. к примеру, как ты определишь - какие из 5(10,25,100 - нужное подчеркнуть) текстов изменились, а какие не надо записывать в БД? на javascript'e напишешь обработчик нажатий? будешь сравнивать с текущей версией в базе? а как быть, если две новости отредактировали, а потом - передумали и захотели отменить редактирование в одной новости и сохранить изменение в другой? будешь добавлять галочку "это не сохранять"? или будешь полагаться на реализацию CTRL + Z в WYSIWYG-редакторе?
не лучше ли все же позволить человеку редактировать новости по одной?
PM MAIL   Вверх
zhpasha
Дата 6.11.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.2.2008

Репутация: нет
Всего: нет



Цитата

а чем тебе не нравиться несколько update запросов, зачем тебе делать их именно одним запросом? 


В принципе оно мне НЕ не нравится. Каким образом их сделать несколько? Пустить цикл?!- не хотелось бы, мягко говоря. 
PM MAIL   Вверх
skyboy
Дата 6.11.2008, 17:47 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(zhpasha @  6.11.2008,  15:29 Найти цитируемый пост)
одним шагом их по средствам php не выполнить?!

через mysqli->multi_query, к примеру, можно выполнить несколько запросов за одно обращение к БД.
средствами "чистого" SQL запрос типа "обнови поле в такое-то значение для записи с id= 25 и в такое-то значение для записи с id=38" не составить, нет.

Добавлено через 41 секунду
но вообще, это как безногому давать костыли - стоять ещё сможет, а вот ходить - нет.
PM MAIL   Вверх
zhpasha
Дата 6.11.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.2.2008

Репутация: нет
Всего: нет



Цитата

первоначальный подход чреват граблями. к примеру, как ты определишь - какие из 5(10,25,100 - нужное подчеркнуть) текстов изменились, а какие не надо записывать в БД? на javascript'e напишешь обработчик нажатий? будешь сравнивать с текущей версией в базе? а как быть, если две новости отредактировали, а потом - передумали и захотели отменить редактирование в одной новости и сохранить изменение в другой? будешь добавлять галочку "это не сохранять"? или будешь полагаться на реализацию CTRL + Z в WYSIWYG-редакторе?
не лучше ли все же позволить человеку редактировать новости по одной? 


Согласен со всем вышесказанным тобой.

Вопрос стоит в "хотелке" заказчика. Я то прекрасно понимаю, как оно будет рациональнее.
Цитата

то придется делать именно так, что очень не хочелось бы( 

Не совсем точно написал я. *То придется делать так, и пытаться объяснить, что ТАК оно удобнее, рациональнее и тд и тп. 

Цитата

средствами "чистого" SQL запрос типа "обнови поле в такое-то значение для записи с id= 25 и в такое-то значение для записи с id=38" не составить, нет.

Вот в это основной вопрос был, спасибо.

Ладно. Если оно так, то буду заниматься объяснениями smile  Спасибо 
PM MAIL   Вверх
ksnk
Дата 6.11.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



уличная Mysql магия...  smile 
прилетели данные 

array(
  array('id'=1,'title'='Hello!1'),
  array('id'=2,'title'='Hello!2', 'visible'=0),
  array('id'=3,'text'='text3'),
)

строим sql

Код

update Table set
   `title`=IF(`id`=1,'Hello!',if(`id`=2,'Hello!2',`title`)),
   `visible`=IF(`id`=2,0,`visible`),
   `text`=IF(`id`=3,'text3',`text`)
;


Один запрос... А ручки-то они вот !  smile

Добавлено через 54 секунды
Как построить запрос - это секрет ! smile

Впрочем, правильное решение уже звучало ....


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Lexxx_HU
Дата 17.11.2008, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 17.10.2006

Репутация: нет
Всего: нет



а еще лучше залезть в phpmyadmin и посмотреть как они там делают update нескольких записей (когда выбираешь несколько записей и нажимаешь редактировать)

хотя я сомневаюсь что там будет сделано самым легким путем .. но тем не менее работает превосходно
PM MAIL   Вверх
zhpasha
Дата 18.11.2008, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.2.2008

Репутация: нет
Всего: нет



2 Lexxx_HU

phpmyadmin делает несколько апдейтов, через ; . Потому и работает превосходно;)
PM MAIL   Вверх
Nigel
Дата 18.11.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: нет
Всего: 19



Цитата(skyboy @  6.11.2008, 17:44 Найти цитируемый пост)
первоначальный подход чреват граблями. к примеру, как ты определишь - какие из 5(10,25,100 - нужное подчеркнуть) текстов изменились, а какие не надо записывать в БД? 

Да ладно, можно это сделать, достаточно правильно массив в запросе передать, затем его разобрать smile 

Цитата(skyboy @  6.11.2008, 17:47 Найти цитируемый пост)
средствами "чистого" SQL запрос типа "обнови поле в такое-то значение для записи с id= 25 и в такое-то значение для записи с id=38" не составить, нет.

Не помню как в "чистом SQL" , лень щас смотреть, а в MySQL можно сделать

Цитата(ksnk @  )

Код

update Table set
   `title`=IF(`id`=1,'Hello!',if(`id`=2,'Hello!2',`title`)),
   `visible`=IF(`id`=2,0,`visible`),
   `text`=IF(`id`=3,'text3',`text`)
;


Зацени для сравнения такой=)
Код

update table set title= case when id=25 then 'hallo'
when id=26 then 'privet' end where id in(25,26)

skyboy, ай-яй-яй, обманули человека, он пошел оправдываться перед начальством))
PM MAIL   Вверх
ksnk
Дата 20.11.2008, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Nigel, Ну да, наверное case к этой задачке лучше подойдет. smile Только , наверное, такой
Код

update table set title= case `id` when 25 then 'hallo' when 26 then 'privet' end where id in(25,26)




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Puls
Дата 24.11.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 24.11.2008

Репутация: нет
Всего: нет



У меня задачка почти такая же. Почти   smile 
Дано - два связанных массива. Одной размерности. A и B. И в таблице есть два поля - X и Y. 
Требуется - увеличить Y на B[i] при условии, что X=A[i]. Для всех элементов массива.

Естественно, в цикле всё легко и просто - UPDATE таблица SET y=y+b[i] WHERE x=a[i].

А как победить одним запросом?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.