Forum Webscript.Ru

Программирование => PHP => Тема начата: Varvara от 04 Февраля 2004, 12:09:31

Название: Как сделать update с увеличением?
Отправлено: Varvara от 04 Февраля 2004, 12:09:31
Как написать update c увеличение на переменную $i для всех полей БД.
for ($i=0;$i<$total;$i++)
Название: Как сделать update с увеличением?
Отправлено: Меняздесьдавнонет от 04 Февраля 2004, 12:33:37
в бд не нет полей.
в бд лежат строки.
а поля - в строках.

если тебе одно поле во всех строках увеличить на единицу,
то update table set pole=pole+1

если нет, то постарайся писать чуть более связно, чтобы не приходилось большую часть задачи за тебя придумывать
Название: Как сделать update с увеличением?
Отправлено: Varvara от 04 Февраля 2004, 12:42:57
Как написать update c увеличение на переменную $i для всех строк БД, если переменная увеличивается по циклу
for ($i=0;$i<$total;$i++)

Пример неработающего кода:

for ($i=0;$i<$total;$i++) {
....
$query = "UPDATE catalogs2 SET cat_left=\'$last_cat_left\'+\'$i\', cat_right=\'$last_cat_right\'-\'$i\' ";
....
}
Название: Как сделать update с увеличением?
Отправлено: Меняздесьдавнонет от 04 Февраля 2004, 12:46:33
я уже понял.
Варенька, милая, почитай вот это пожалуйста
http://phpclub.ru/talk/showthread.php?s=&threadid=26843
после того, как жгучий стыд пройдет, опиши нам тему, над которой ты работаешь, и мы с тобой вместе выведем формулу.
Договорились?
Название: Как сделать update с увеличением?
Отправлено: Varvara от 04 Февраля 2004, 13:08:22
Проблему я описала выше, более узко к примеру кода.
Есть цикл увеличивающийся на $i - единицу как написать запрос на обновление на эту увелич. переменную???
Название: Как сделать update с увеличением?
Отправлено: Меняздесьдавнонет от 04 Февраля 2004, 13:24:27
пошла вторая итерация....

Варенька, милая, почитай вот это пожалуйста
http://phpclub.ru/talk/showthread.php?s=&threadid=26843
после того, как жгучий стыд пройдет, опиши нам тему, над которой ты работаешь, и мы с тобой вместе выведем формулу.
Договорились?

писать запрос на увеличение переменной - это значит не понимать программирования вообще. это вместо программы использовать счетные палочки.

меня интересует не твой апдейт, а задача, которую ты с его попощью решаешь. Неужели я так непонятно пишу?
Название: Как сделать update с увеличением?
Отправлено: Varvara от 04 Февраля 2004, 13:35:02
Таблица:

Были значения -

cat_left - cat_right

1 - 6
2 - 5
3 - 4

Хотелось бы -

cat_left  cat_right

2 - 7
3 - 6
4 - 5

Пишу запрос на перемещение потомков по Nested Sets, знаю что есть function moveAll в классе Nested Sets.
Название: Как сделать update с увеличением?
Отправлено: Меняздесьдавнонет от 04 Февраля 2004, 13:40:41
если не работает запрос, то надо вывести mysql_error() и сам запрос на экран.
Название: Как сделать update с увеличением?
Отправлено: Varvara от 04 Февраля 2004, 15:51:45
Что такое mysql_error() , я знаю, ответь на мой вопрос!

Как обновить БД циклической переменной $i ???
Название: Как сделать update с увеличением?
Отправлено: Меняздесьдавнонет от 04 Февраля 2004, 16:09:57
точно так же, как и не циклической.
вообще, можно бы и сообразить, что источник переменной - цикл или форма или руками присвоил - никакого значения на синтаксис запроса не имеет.
как запрос составила - так он и выполнился.

ты where в апдейте указываешь?
или за тебя это Пушкин АС будет делать?
Название: Как сделать update с увеличением?
Отправлено: гоша от 04 Февраля 2004, 16:32:04
Да нет, девушка одной простой вещи не понимает.

Видите ли, Варя, когда вы пишете

UPDATE таблица SET что-нибудь WHERE условие

то "что-нибудь" будет выполнено для ВСЕХ записей, для которых верно "условие". Иными словами, "цикл" за вас проделает база данных. Сама. То есть вам никакого цикла писать не надо .
Название: Как сделать update с увеличением?
Отправлено: Меняздесьдавнонет от 04 Февраля 2004, 17:22:36
гоша но тогда надо переменную вводить.
я вообще, в этой технологии нестед сетс не разбирался.
может быть, там действительно надо в цикле у определенных полей значение увеличивать.
Название: Как сделать update с увеличением?
Отправлено: Макс от 04 Февраля 2004, 17:44:37
Varvara
при чем здесь циклическая переменная ? При перемещении узла, cat_left, cat_right у узла и всех его потомков меняются на одинаковое значение:
UPDATE tab SET cat_left = cat_left + 1, cat_right=cat_right+1 WHERE cat_left BETWEEN  1 AND 6.

PS
dbtree c исправленным методом moveAll лежит на
http://max.phpclub.net/sources/dbtree.phps (правда на реальных проэктах не оттестирован)
Название: Как сделать update с увеличением?
Отправлено: Макс от 04 Февраля 2004, 17:47:17
запрос который я привел - лишь для примера, что смещения на одинаковое значение меняются. Для перемещения надо запрос посложнее делать
Название: FOR Макс
Отправлено: Varvara от 05 Февраля 2004, 15:41:15
На самом деле цикл берется из проверки потомков, взависимости от количества потомков, зная новое значение родителя после перемещения, имея цикл легко создать потомков увеличивая cat_left и уменьшая cat_right на $i, это очень логическое решешие проблемы.

Я не вникала в код function moveAll, т.к. хочу разабраться сама и почти написала свои функции для работы с этим алгоритном, осталось разобраться с перемещением, бьюсь целую неделю, до конца не могу нащупать универсальный путь.

СПАСИБО!
Название: Как сделать update с увеличением?
Отправлено: Макс от 05 Февраля 2004, 16:20:35
Цитировать
Varvara:
На самом деле цикл берется из проверки потомков, взависимости от количества потомков,

кол-во потомков = (cat_right - cat_left - 1) / 2
и не надо никакого цикла
Цитировать
Varvara:
до конца не могу нащупать универсальный путь.
при перемещении надо 3 варианта обрабатывать:
 - перемещение ула влево
 - перемещение узла вправо
 - перемещение вверх
(так сделано в moveAll хотя реально он не оттестирован)
Название: FOR Макс
Отправлено: Varvara от 05 Февраля 2004, 17:39:59
Обьясни мне хоть ты как сделать так:

Рабочий пример -

$pot =($cat_right - $cat_left - 1) / 2;

for ($i=1; $i<=$pot;$i++){

$query = "INSERT INTO catalogs2 (cat_left, cat_right) values(\'$cat_left\'+\'$i\', \'$cat_right\'-\'$i\')";
mysql_query( $query, $db )or die ( "Не могу добавить новые данные в базу");
mysql_close( $db);

}

Делает то что мне надо, а то же самое с update не работает -

$pot =($cat_right - $cat_left - 1) / 2;

for ($i=1; $i<=$pot;$i++){

$query = "UPDATE catalogs2 SET cat_left=\'$cat_right\'+\'$i\', cat_right=\'$cat_right\'-\'$i\' where cat_left between \'$cat_left\' and \'$cat_right\'";

mysql_query( $query, $db )or die ( "Не могу обновить данные в базе");
mysql_close( $db);
}
Название: Как сделать update с увеличением?
Отправлено: Макс от 05 Февраля 2004, 18:11:26
Цитировать
Varvara:
$pot =($cat_right - $cat_left - 1) / 2;

for ($i=1; $i<=$pot;$i++){

$query = "INSERT INTO catalogs2 (cat_left, cat_right) values(\'$cat_left\'+\'$i\', \'$cat_right\'-\'$i\')";
mysql_query( $query, $db )or die ( "Не могу добавить новые данные в базу");
mysql_close( $db);

}
что делает этот пример? Я понял что какие-то узлы добавляет, но какие ?

и что ты хочешь сделать Update-ом ?
Название: FOR Макс
Отправлено: Varvara от 05 Февраля 2004, 18:26:03
Эти упращеные примеры по работе с родителем и потомками каталога?

У меня вопрос почему insert работает в цикле, а update нет?

А вообще мне нужно изменить значение потомков, было
после нового значения ровдителя

8 - 13
5 - 8
6 - 7
 
Как одним update изменить, что бы было так

8 -13
9 - 12
10 -11

Родитель и потомки перемещены.
Название: Как сделать update с увеличением?
Отправлено: Макс от 05 Февраля 2004, 18:36:14
Цитировать
Varvara:
А вообще мне нужно изменить значение потомков, было
после нового значения ровдителя

8 - 13
5 - 8
6 - 7

Как одним update изменить, что бы было так

8 -13
9 - 12
10 -11

А для первого узла (8 - 13) - ничего менять не надо ?

UPDATE tab SET cat_left = cat_left + 4, cat_right = cat_right + 4 WHERE cat_left BETWEEN 9 AND 12
Название: Как сделать update с увеличением?
Отправлено: Макс от 05 Февраля 2004, 18:37:59
Цитировать
Макс:
А для первого узла (8 - 13) - ничего менять не надо ?

а, теперь понял. там ничего не надо
Название: Как сделать update с увеличением?
Отправлено: Макс от 05 Февраля 2004, 18:41:10
Цитировать
Varvara:
У меня вопрос почему insert работает в цикле, а update нет?

1. ты так и не объяснила, что делают твои запросы (то что это упрощенные примеры - мне не о чем не говорит)
2. Я хоть ничего и не понял, но по-моему для Update-запроса цикл не нужен. Просто один раз выполни запрос, который я привел выше
Название: for Макс
Отправлено: Varvara от 09 Февраля 2004, 10:49:04
Мне не понятен алгоритм обновления потомков после перемещения, если родитель имеет несколько потомков, как их изменить все разом, поотдельности понятно.

Я хочу сделать так, зная обновленные значения родителя, можно вычеслить потомков:
1-ый cat_left+1 и cat_right-1
2-ой cat_left+2 и cat_right-2

Я хотела эти значения, увеличения и уменьшения на 1 и 2
взять из найденного количества потомков и циклично изменить, но update не помогает!?

Может создать временную таблицу и insert изменить поля
cat_left и cat_right, а потом обновить основную таблицу.
Название: Как сделать update с увеличением?
Отправлено: Макс от 09 Февраля 2004, 17:39:33
Цитировать
Varvara:
как их изменить все разом, поотдельности понятно.
я уже несколько раз в этой ветке показал пример update-запроса, который изменяет смещения для всех потомков. Если тебе он не помог, то это уже проблемы реализации алгоритма. Ищи ошибку.
Цитировать
Varvara:
Я хочу сделать так, зная обновленные значения родителя, можно вычеслить потомков:
1-ый cat_left+1 и cat_right-1
2-ой cat_left+2 и cat_right-2

Я хотела эти значения, увеличения и уменьшения на 1 и 2
взять из найденного количества потомков и циклично изменить,
вот здесь совершенно ничего не понял
Цитировать
Varvara:
Может создать временную таблицу и insert изменить поля
cat_left и cat_right, а потом обновить основную таблицу
если проблему можно решить без временной таблицы, то не надо ее использовать
Название: for Макс
Отправлено: Varvara от 09 Февраля 2004, 20:45:42
Ты не понял что это:

1-ый cat_left+1 и cat_right-1
2-ой cat_left+2 и cat_right-2

Это и есть алгоритм перемещения потомков родителя между другими родителями и потомками.

Данное пример:
UPDATE tab SET cat_left = cat_left + 4, cat_right = cat_right + 4 WHERE cat_left BETWEEN 9 AND 12

НЕ УНИВЕРСАЛЬНЫЙ СПОСОБ, он не подходит всех случаев перемещения (пока говорю перемещении  только вверху вниз)

Мне нужен ответ как ИЗМЕНИТЬ потомки новыми значениями ни как не связанными со старыми, связь есть только с новым значением родителем по схеме которую ты не понял.

Не ужели UPDATE не работает в цикле !!! ???
ЭТО ГЛАВНЫЙ ВОПРОС?
Название: UPDATE не работает в цикле !!! ???
Отправлено: Varvara от 09 Февраля 2004, 20:52:42
Как работает UPDATE в цикле? И работает ли вообще?!!
Можно пример!


for ($i=1; $i<=$pot;$i++){
$query = "UPDATE catalogs SET cat_left=\'$i\', cat_right=\'$i\' where cat_left between \'$cat_left\' and \'$cat_right\'";
mysql_query( $query, $db )or die ( "Не могу обновить данные в базе");
}
mysql_close( $db);
Название: Как сделать update с увеличением?
Отправлено: Макс от 09 Февраля 2004, 23:34:22
Цитировать
Varvara:
UPDATE tab SET cat_left = cat_left + 4, cat_right = cat_right + 4 WHERE cat_left BETWEEN 9 AND 12
я же писал, что этот запрос лишь пример - для реального перемещения надо делать запрос на порядок сложнее. Пример можешь посмотреть в классе dbtree (там 3 варианта перемещения рассматривается  - влево, вправо и верх и для каждого варианта свой запрос)
Название: Как сделать update с увеличением?
Отправлено: Макс от 09 Февраля 2004, 23:37:01
Varvara
update в цикле работает, ты неправильный запрос делаешь. Такого :
Цитировать
Varvara:
cat_left=\'$i\', cat_right=\'$i\'
в Nested Sets вообще не может быть (cat_left не может быть равен cat_right).
Далее если ты делаешь в цикле изменение, то не надо писать в условии
Цитировать
Varvara:
cat_left between \'$cat_left\' and \'$cat_right\'

Там должно быть что-то вроде
WHERE cat_id = $cat_id
Название: for Макс
Отправлено: Varvara от 10 Февраля 2004, 06:07:54
Макс СПАСИБО за помощь, но ты не врубаешься!

В классе dbtree, только перемещение потомков, но не родителя с потомками, если б было так просто.

Который раз я задаю вопрос как увеличить значение в прогрессии 1, 2, 3 и т.д.
Название: Как сделать update с увеличением?
Отправлено: Varvara от 10 Февраля 2004, 06:11:00
Я не спрашиваю если в Nested Sets или нет, ВОПРОС совсем другой, не про Nested Sets, если не знаешь не пиши!!!
Название: Как сделать update с увеличением?
Отправлено: Меняздесьдавнонет от 10 Февраля 2004, 10:48:31
макс, пиркрыть тему?
Название: FOR RomikChef
Отправлено: Varvara от 10 Февраля 2004, 12:36:31
Ага можешь мою тему грахнуть!
Не обижусь.
Название: Как сделать update с увеличением?
Отправлено: Меняздесьдавнонет от 10 Февраля 2004, 12:44:30
варечка, ты пожалуйста поучись запросы писать.
сначала не в цикле, а просто напиши в столбик.
А сначала - вообще один.
понимая, что ты хочешь сделать. Понимая, что должен делать запрос
Название: Как сделать update с увеличением?
Отправлено: Макс от 10 Февраля 2004, 15:20:57
Цитировать
Varvara:
В классе dbtree, только перемещение потомков, но не родителя с потомками

Да ? И что по твоему выполнит такой код:
$tree->moveAll($cat_id, $new_parent_id);
Отвечаю: переместит узел $cat_id (и всех его потомков) в $new_parent_id

Цитировать
Varvara:
Который раз я задаю вопрос как увеличить значение в прогрессии 1, 2, 3 и т.д.


$rows = array(1, 3, 13, 14, 18, 24, 30); // список, узлов которые меняем
$k = 0;
for($i=1; $i < sizeof($rows); $i++) {
  $sql = "UPDATE tab SET field = $i WHERE id = ".$rows[$k++];
   mysql_query($sql) or die (mysql_error());
}
Название: Как сделать update с увеличением?
Отправлено: Макс от 10 Февраля 2004, 15:23:21
Цитировать
RomikChef:
макс, пиркрыть тему?

не, я еще помучаюсь :)