|
|
|
| Есть запрос
$s1 ="SELECT nakop,date FROM tab WHERE date>$enddate ORDER BY s_id,date ";
$s = mysql_query($s1) or die ('Нет связи с сервером. ' .mysql_error());while($val = mysql_fetch_array($sbt));
while($val = mysql_fetch_array($s))
{
.........
$n=$n=+$val['nakop'];
$s = mysql_query(" UPDATE tab SET nakop='$n' WHERE date>$enddate ");
........
}
|
Мне надо в цикле заменить в запросе поле nakop на накопительные данные ,сформированные в переменной $n для всех строк,у которых дата больше выбранной даты $enddate (из первого запроса)
спасибо. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 18:28)
| | А это что такое while($val = mysql_fetch_array($sbt)); ?
А не один ли единственный запрос вам нужен, если я правильно понимаю чего надо? | |
|
|
|
|
|
|
|
для: confirm
(20.09.2012 в 20:58)
| | Я корректировала запрос-из большого делала меньший для форума.
while($val = mysql_fetch_array($sbt)); ?
Это лишнее,случайно оставила. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 21:01)
| | $n=$n=+$val['nakop']; - это не понятно в цикле (видимо тоже лишняя $n затесалась, и операторы перепутаны), но даже правильная запись:
$n += $val['nakop'];
лишена смысла - изначально $n у вас равна hull.
Если я правильно понимаю, то вам надо в таблице tab увеличить значение поля на значение взятое из другой таблицы, у которых дата больше некоторой? | |
|
|
|
|
|
|
|
для: confirm
(20.09.2012 в 21:10)
| | нет.Все происходит в одной таблице.Сначала я согласно выбранной дате из календаря высчитываю значение определенного поля.
А потом я изменяю значение поля nakop во всех датах,больших за выбранную дату .Это будет в цикле.
Если сделать все что я писала за определенный день,то все получается.А мне надо сделать в таблице для дат>вібранной даты | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 21:20)
| | Вы сперва вот эту строку отдельно выполните:
$n=$n+$val['nakop'];
Сначала вы получите предупреждение, что переменной $n не существует и ваше первое обновление ни с чем не будет просуммировано. А вот при каждом следующем проходе к нему будет добавляться новые значения полученные ранее из запроса. Например, запрос вернул вам значения 2, 3, 4, 5. Тогда в обновление уйдут значения 2, 5, 9, 14. Это вам и надо? | |
|
|
|
|
|
|
|
для: confirm
(20.09.2012 в 21:42)
| | поймите,я упрощала запрос.И эта переменная у меня объявлена с присвоением нуля ранее . | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 21:49)
| | ведь там стоит многоточие-это и значит что опущены действия.Я выбрала самое необходимое и упростила. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 21:50)
| | Да я не об этом спрашиваю, что там за многоточиями, я пытаюсь выяснить "по каким правилам" происходит обновление поля.
Например, есть некое поле, которое я буду "накапливать", но на фиксированную величину, например 5. Тогда я пишу: SET val=val+5.
Или, как я понимаю, что вы и хотите сделать, это к существующему значению этого поля, добавить его же значение: SET val=val+val.
Вы ведь его получаете, затем суммируете, НО... Вы отдельно просто запустите цикл массива, например 1,2,3,4 и посмотрите что будет происходить со значением N в цикле, если вы его будете суммировать. А получиться следующее: 1, 3, 6, 10.
Тогда получается, если вы получили эти значения из базы, и пусть все соответствуют условию, что больше даты, тогда ваши поля обновляться именно на эти значения: 1, 3, 6, 10.
Понимаете о чем я спрашиваю?
PS. Причем нет никакой гарантии, что обновляться будут именно те поля, которые вам и нужны. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 18:28)
| | вообще, запрос в цикле - это очень плохо!
И я сомневаюсь, что без цикла нельзя обойтись.
Вы бы описали полностью задачу, а не спрашивали, как исправить кусок кода, к которому вместо многоточий еще неизвестно что прилеплено и неизвестно какие ошибки дает или может давать.
А пока вообще не понятно в чем вопрос. У вас что написано в вопросе, то и в коде написано.
Проблема в чем?
Ну разве что $enddate в кавычки нужно взять, а у '$n' убрать кавычки. | |
|
|
|
|
|
|
|
для: Sfinks
(20.09.2012 в 22:03)
| |
$n=0;
$s1 ="SELECT ar,nakop,date FROM tab WHERE date>$enddate ORDER BY s_id,date ";
$s = mysql_query($s1) or die ('Нет связи с сервером. ' .mysql_error());
while($val = mysql_fetch_array($s));
{
.........
$n=$n+$val['ar''];
$s = mysql_query(" UPDATE tab SET nakop='$n' WHERE date>$enddate ");
........
}
|
Попытаюсь объяснить.Есть ежедневные данные (ar) и накопительные данные с начала месяца(nakop). в таблице Выбрали дату (enddate) и по ней откорректировали накопительніе данные-nakop(так бывает..) и теперь надо откорректировать все остальные nakop для всех дат больших за выбранную дату,а для этого надо прибавлять ежедневно к этому nakop значение поля ar и записівать в поле nakop. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 22:21)
| | Я вам пытаюсь объяснить, что у вас непонятно, что твориться в запросе, а вы бросаетесь с объяснениями от поста до поста.
UPDATE tab SET nakop='$n' WHERE date>$enddate - без конкретно для какой записи, сначала всем записям удовлетворяющим date>$enddate текущее значение $n, затем опять всем записям удовлетворяющим date>$enddate следующее значение $n, и так в течении цикла вашего. Причем с нарастающим суммированием не понятно по какому закону.
Это вы понимаете? | |
|
|
|
|
|
|
|
для: confirm
(20.09.2012 в 22:26)
| | Я,НАВЕРНОЕ,не понимаю.Да,так и получилось,что у меня в таблице поменялись все nakop на последнее значение за все дни.НО на экран я выводила-все правильно формируется в переменной $n. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 22:34)
| | Вы можете без $n += чего-то... объяснить по какому принципу должно происходить обновление поля? Возможно ведь, что вам нужен будет всего лишь один единственный запрос на обновление, без всякой выборки предшествующей и тем более запросов в цикле.
Для этого вас и просят - объясните, напишите.
Если же для каждой из записи, новое значение, это нечто уникальное, которое не описывается единой для всех полей формулой, тогда да - выбрали, посчитали, в цикле обновляем. Но обновлять то надо с учетом ID, а не времени. Так как вы предварительный запрос (выборку) уже сделали по этому условию, а обновлять уже надо по конкретному id.
PS. На экран вы выводили, надо полагать $n, вот и казалось, что правильно, а что в это время в базе происходило, осталось за кадром, хотя и так понятно, что не то, что хотелось бы. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 22:34)
| | Попробую сделать тогда вместо всего того,что писала так
$s = mysql_query(" UPDATE tab SET nakop=nakop+ar WHERE date>$enddate ");
|
| |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 22:41)
| | Если nakop+ar, это и есть формула обновления значений и для всех полей одна и та же, то именно так и надо делать - одним запросом. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 22:41)
| | я писала,но Вы не поняли.
ar nakop date
10 100 17/09/2012
20 120 18/09/2012
30 150 19/09/2012
а теперь,допустим,17/09 изменили значение nakop на 250
значит,надо поменять ВСЕ nakop
ar nakop date
10 250 17/09/2012
20 270 18/09/2012
30 300 19/09/2012
т.е. надо к откорректированному nakop прибавлять ar и записать в таблицу в поле nakop и так каждый день | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 22:51)
| | То есть, в данном примере, увеличили значение на 150. Ну и делайте запрос добавляя 150 к значению этих полей. Вот только причем тут ar, я не понял. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 22:51)
| | но только nakop берется за предыдущий день,a ar берется за текущий день суммируются и записывается это значение в поле nakop текущего дня. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 22:56)
| | nakop-накопительные данные,ar- приход ежедневный.Вот и суммируем ,накапливаем эти данные.Иначе никак. | |
|
|
|
|
|
|
|
для: morozmoroz
(20.09.2012 в 22:56)
| | По примеру выше я не заметил, чтобы ar суммировалось к полю nakop (по результату значений не видно). Но в общем, если вы знаете, что к чему прибавить, то и проблем нет. Единственно, что вы можете не знать, так это на какую величину увеличить. Но вы ведь знаете, что эта величина для всех полей одна и та же, значит два варианта:
а) новая величина (после которой требуется коррекция) это добавление значения N к существующему. Пусть это как и в примере будет 150. Тогда нужно сразу добавлять ее всем полям этой даты:
UPDATE tab SET nakop=nakop+150 WHERE date>$enddate
б) новая величина, это значение N, которым заменили запись М, и опять как в примере, пусть будет для поля первого и равна 250. В этом случае, прежде чем ее заменить на новое значение, нужно получить старое (100), затем получить величину корректировки (250-100=150), и уже затем для всех записей как и ранее.
Как у вас все это происходит, я не знаю, но вам то все известно, значит и карты в руки. | |
|
|
|
|
|
|
|
для: confirm
(20.09.2012 в 23:06)
| | Спасибо. | |
|
|
|