Есть необходимость изменить значения нескольких полей в таблице по сложным алгоритмам, данные для которых берутся из других полей этой же таблицы. Эти алгоритмы, как мне кажется, невозможно реализовать только внутри команды UPDATE. В связи с этим решил делать так: 1. Делается выборка командой SELECT всех записей таблицы 2. В цикле по результату запроса по каждой строке: 2.1 на PHP вычисляются значения полей, которые необходимо занести 2.2 командой UPDATE эти значения вносятся в поля текущей строки таблицы С консоли виндов запускаю пробный скрипт , но он не хочет модифицировать значение поля. PHP сообщает об ошибке: Query was empty Код привожу ниже: <?php $db_name="ns02";//база данных $table="t01";//таблица $host="localhost";//хост $user="";//логин $pass="";//password $link=mysql_connect($host,$user,$pass) or die(mysql_errno($link).mysql_error($link)); $link2=mysql_connect($host,$user,$pass) or die(mysql_errno($link2).mysql_error($link2)); //выбираем базу данных $db=mysql_select_db($db_name,$link) or die(mysql_errno($link).mysql_error($link)); $db2=mysql_select_db($db_name,$link2) or die(mysql_errno($link2).mysql_error($link2)); //выберем данные $guery = "SELECT * FROM t01"; $result=mysql_query($guery, $link) or die(mysql_errno($link).mysql_error($link)); while($data=mysql_fetch_assoc($result)){ echo $data["tm"]," : "; //если закомментировать следующие две строчки - предыдущая строка нормально выводит значения поля tm, //значит запрос на выборку сам по себе работает нормально $query2 = "UPDATE t01 SET oi1 = 1 WHERE tm = ".$data["tm"]; mysql_query($guery2, $link2) or die(mysql_errno($link2).mysql_error($link2)); } mysql_free_result($result); mysql_close($link); mysql_close($link2); ?>
Отвечаю Код (Text): Update Table Set Field1=X1, Field2=X2 Where Field3 in (Select from Table Where .....) And Field4 in (Select From Table Where .....) Or ..... Главное, чтобы подзапросы не использовали в своих условиях, поляк оторые нужно изменить [/code]
версия ПХП и Мускуля какие? Если Мускуль 3 - подзапросы, как Goryn предлагает, работать не будут. а младший ПХП не умеет открывать одновременно 2 коннекта с мускулю.
Код (Text): resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]] ) Если второй вызов функции произошёл с теми же аргументами mysql_connect(), новое соединение не будет установлено. Вместо этого функция вернёт ссылку на уже установленное соединение. Параметр new_link может заставить функцию mysql_connect() открыть ещё одно соединение, даже если соединение с аналогичными параметрами уже открыто. Поэтому не имеет смысла открывать два соединения. Тем более одновременно выбирать одну и ту же БД forward, перед выполнением запроса выведи print $query2 и проверь его правильность.
не получится, ибо расчет нового значения поля будет идти по сложным алгоритмам, которые в конструкциях SQL реализовать невозможно, кроме того записей в таблице будет несколько тысяч, на все эти несоколько тысяч случаев if не проставишь, да и моя версия mySQL не поддерживает вложенных запросов
Переделал скрипт, чтобы запросы пользовались одним соединением. Результаты практически те же. Текст скрипта: Код (Text): <?php $db_name="ns02";//база данных $table="t01";//таблица $host="localhost";//хост $user="";//логин $pass="";//password $link=mysql_connect($host,$user,$pass) or die(mysql_errno($link).mysql_error($link)); //выбираем базу данных $db=mysql_select_db($db_name,$link) or die(mysql_errno($link).mysql_error($link)); $guery = "SELECT * FROM t01"; $artm = array(); $counter = 0; $result=mysql_query($guery, $link) or die(mysql_errno($link).mysql_error($link)); //сбрасываем значения поля tm в массив while($data=mysql_fetch_assoc($result)){ echo $data["tm"]," : "; $artm[counter] = $data["tm"]; $counter+=$counter; } //освободить выделенную под результат выборки память mysql_free_result($result); //в цикле по массиву пытаемся изменить данные foreach ($artm as $item) { $query2 = "UPDATE `t01` SET `oi1` = 1 WHERE tm = "."'".$item."'"; echo $query2; mysql_query($guery2, $link) or die(mysql_errno($link).mysql_error($link)); } mysql_close($link); ?> В отладочной информации выводит следующее: 0430 : 0415 : 0400 : 0345 : 0330 : 0315 : 0300 : 0245 : 0230 : 0215 : 0200 : 0145 : 0130 : 0115 : 0100 : 0045 : 0030 : 0015 : 0000 : UPDATE `t01` SET `oi1` = 1 WHERE `tm` = '0000'1065Query was empty Здесь: > до слова UPDATE - значения поля tm, выводимые в цикле по запросу, > UPDATE `t01` SET `oi1` = 1 WHERE `tm` = '0000' - программно сформированный текст запроса, причем явно видно, что второй цикл был выполнен только один раз, далее цикл явно не срабатывает, иначе текст запроса был бы выведен несколько раз, с разными значениями > 1065Query was empty - описание ошибки (в гугле ничего вразумительного по этому поводу не нашел) Запрос из отладочной инфы запустил без PHP, на самом mySQL - сработал нормально, без ошибок, значение поля oi1 изменилось.
Несколькими тысячами записей в таблице сервера БД меня сложно удивить. Я рабораю с базами в которых количество записей в таблицах сотни тысяч. На счет MySql не знаю, но в Oracle и MsSql есть такое понятие как хранимые процедуры и функции, которые можно использовать в запросах.
Оракл вообще вещь! Я кстати недавно слышал, что они начали разработатывать нереляцонную субд. Object-oriented, типа, на XML основанную...
Ну, какие никакие, а штука интересная.. ну, я и не думаю что они прям в XML хранится будут, скорее всего он их выдавать как результат XPath запроса будет... Кто знает? Но надо уже морально готовится с таблицам с произвольным числом столбцов в каждой записи ))