С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
10 / 10 / 1
Регистрация: 07.06.2010
Сообщений: 124

Несколько UPDATE запросов заменить на один

24.05.2013, 16:17. Показов 2883. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. В данный момент у меня по циклу выполняются 5 UPDATE запросов. К примеру таких:
SQL
1
2
3
4
5
mysql_query("UPDATE `pr` 
                      SET `x`='".$x[$i]."', 
                             `y`='".$y[$i]."',  
                             `z`='".$z[$i]."' 
                      WHERE `id`=".$id[$i]." AND `uniq`=".$uniq[$i]." ");
Тут сразу нарушается одно из важнейших правил - "Не вставлять запросы в цикл". Так вот, как с помощью php "собрать" все данные и вставить в один UPDATE запрос? C INSERT например я делаю так:

PHP
1
2
3
4
5
6
7
//собираю все в массив
for ($i = 0; $i <5; $i++) {
$x=$i+2;
$y=$i+3;
$z=$i+4;
$a[] = "('" . $x . "', '" . $y . "', '" . $z . "')";
}
SQL
1
2
//вставляю одним запросом собранное
$sql = mysql_query("INSERT INTO `pr` (`x`, `y`, `z`) VALUES " . JOIN(",", $a));
А вот усовершенствовать вышеприведенный UPDATE никак не выходит...

Добавлено через 14 часов 28 минут
Что неужели нет знающих людей, или поставленная задача нерешаемая? Если что-то непонятно вы хотябы спрашивайте
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.05.2013, 16:17
Ответы с готовыми решениями:

Собрать несколько запросов в один
Добрый день, уважаемые. Приходится тут осваивать SQL в срочном порядке ( Помогите, плз. Есть пара строчек, которые по идее завязаны...

Как объединить несколько запросов в один?
подскажите пожлалуйста как можно объеденить несколько запросов в один

Несколько запросов в один дата грид
У меня есть запрос который выводит данные из некоторых таблиц базы в DataGrid. Нужно добавлять аналогичные запросы в этот DataGrid но уже...

9
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
24.05.2013, 16:24
ну так инсерт ты же не по условию делаешь, а апдейт с where, где для каждой строки оно свое.
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
24.05.2013, 16:27
Linnard, В INSERT если Вы вставляете много записей, то в запросе Вы пишете много списков значений с разными значениями. Вы указываете сами значения. По смыслу одни записи от других ничем не отличаются: запрос говорит "Вставь в таблицу вот такие-то записи с вот такими-то значениями".

UPDATE же - это совсем другая операция. Вы не можете в одном запросе сказать "Измени эту запис так, ту - вот так, а этоу - вот так". Вы можете сказать только "Измени вот такие-то записи вот так-то". Все записи, которые прошли фильтрация в WHERE, - все обновятся одинаковым способом, как указано в SET. Другое дело, что UPDATE - это именно UPDATE, а не INSERT, и в SET можно именно изменять значения полей - вычислять новое значение, используя старое (SET `x` = `x` + 1).
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
24.05.2013, 16:32
Цитата Сообщение от Linnard Посмотреть сообщение
Тут сразу нарушается одно из важнейших правил - "Не вставлять запросы в цикл".
Откуда ты такое правило взял? Если по алгоритму нужно, то вполне можно вставлять
0
10 / 10 / 1
Регистрация: 07.06.2010
Сообщений: 124
24.05.2013, 16:43  [ТС]
Цитата Сообщение от Grossmeister Посмотреть сообщение
Откуда ты такое правило взял? Если по алгоритму нужно, то вполне можно вставлять
Очень много источников об оптимизации запросов гласят об этом. Ну можно если итераций несколько. Но это считается плохой практикой. А если цикл на 100 итераций? А если вдобавок на сайте одновременно 10 000 чел дергают этот скрипт?
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
24.05.2013, 16:51
Цитата Сообщение от Linnard Посмотреть сообщение
Очень много источников об оптимизации запросов гласят об этом
Тут надо отделять мухи от котлет.
Если, допустим, я одним запросом могу выбрать тысячу строк, а я эти строки буду выбирать тысячью запросов по одной строке, то это плохо.
А если, скажем, мне надо вставить тысячу строк, то куда ты денешься? В Oracle, например, нет формы INSERT со вставкой нескольких записей (за исключением INSERT ... SELECT).
0
10 / 10 / 1
Регистрация: 07.06.2010
Сообщений: 124
24.05.2013, 18:55  [ТС]
Решение найдено. Все гениальное просто:
SQL
1
2
3
4
mysql_query("INSERT INTO `pr` (`id`, `x`, `y`,`z`) 
                      VALUES " . JOIN(",", $a). " 
              ON DUPLICATE KEY 
              UPDATE x=VALUES(x), y=VALUES(y), z=VALUES(z) ");
Надеюсь, это поможет тем кто столкнулся с моей проблемой
1
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
25.05.2013, 07:56
Цитата Сообщение от Linnard Посмотреть сообщение
Решение найдено
Это не решение, а костыль. UPDATE и INSERT - это две разные вещи, как отвертка и гвоздь.
0
10 / 10 / 1
Регистрация: 07.06.2010
Сообщений: 124
26.05.2013, 14:46  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Это не решение, а костыль.
Если Вы считаете, что это костыль тогда может подскажете лучший вариант решения?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
26.05.2013, 14:52
Цитата Сообщение от Linnard Посмотреть сообщение
Если Вы считаете, что это костыль тогда может подскажете лучший вариант решения?
Это Ваше "решение" имеет побочный эффект, который себя не проявляет только "с божьей помощью", и то только до поры, до времени.
Настоящее решение Вы изложили в первом посте: цикл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.05.2013, 14:52
Помогаю со студенческими работами здесь

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

Может ли один обработчик принимать несколько запросов одновременно?
Задача примерно такая: Есть сервер удаленный. На нем лежат php обработчики приложения. Есть клиенты которые при помощи кроссдоменного...

Как объединить несколько запросов с датами и значениями этих дат в один запрос?
Привет, Народ! Вопрос такой: Есть несколько запросов с двумя полями 1. Дата и 2 Значение даты. как объединить эти запрос в...

Можно ли объединить несколько таких запросов в один, по принципу нет результата, то другой запрос?
Можно ли объединить несколько запросов в один, по принципу, если по первой части запроса результата не оказалось, то выполняется другая? ...

Заменить один символ на несколько
Добрый день, у меня вопрос по С++. Как сделать что бы в чаре менял 1 символ на несколько? Не могу постичь этого. И ещё как мне заменять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru