Возможно ли упростить алгоритм.

PRO

Новичок
Возможно ли упростить алгоритм.

Есть таблица вида:
id category sub_category time

То что нужно сделать.
Выбрать записи:
SELECT id FROM table ORDER by category,sub_category

Для каждой полученной записи сделать UPDATE в цикле
time_to_set+=10 (прибавляем 10 сек от предыдущего значения)
UPDATE TABLE SET time=time_to_set WHERE id=id (id из цикла для селекта)

В результате куча запросов с UPDATE.

Есть ли возможность сделать это проще(идеально одним sql запросом)

Заранее благодарен за помощь.
 

PRO

Новичок
У меня сейчас тоже самое и релизовано.
Необходимо сделать UPDATE не для одной записи а для всех сразу.
Значение time всех записей должно увеличиваться на определенное число(10 в условии).
 

Dovg

Продвинутый новичок
Код:
mysql> set @counter = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> select ..., @counter:=@counter+10 from ... ;
+-------------+---------------------+-----------------------+
|                  |  ....                     | @counter:=@counter+10 |
+-------------+---------------------+-----------------------+
|              |                               |                    10 |
|              |                               |                    20 |
ну и так далее
в update так же
 

PRO

Новичок
Данная операция увеличит у всех записей значение tim на 10.
Мне нужно другое.
Пример: результат SELECT'a-
1 ... 0
2 ... 0
3 ... 0
После UPDATE должно получиться следущее:
1 ... 10
2 ... 20
3 ... 30
 

PRO

Новичок
Какой должен быть синтаксис у UPDATE с counter ?

Разобрался. Спасибо за участие.
 

nirex

Новичок
set @test_t=0;UPDATE TABLE SET time=(@test_t := @test_t + 10) WHERE id in (SELECT id FROM table ORDER by category,sub_category)

-~{}~ 13.05.08 15:21:

ой , поздно же я проснулся )))))
 

PRO

Новичок
Задача усложнилась.
Order by теперь нужно делать не по полям таблици.
Есть доп таблици category_list и sub_category_list к которым привязаны поля category и sub_category.
ORDER BY должен быть типа category_list .weight,sub_category_list.weight(т.е нужен JOIN) .
Как быть если UPDATE с JOIN не позволяет ORDER.
А вариант Nirex - set @test_t=0;UPDATE TABLE SET time=(@test_t := @test_t + 10) WHERE id in (SELECT id FROM table ORDER by category,sub_category) выдает You can't specify target table 'table' for update in FROM clause.

Сделал отдельный запрос на получение всех записей отсортированных как надо.
Засунул все id в нужном порядке в IN.
Получается mysql игнорирует порядок в IN?

Знатоки. Подскажите как проще можно решить данную задачу.

-~{}~ 15.05.08 22:53:

Проблему решил.
Если у кого-нибудь возникнет подобная задача:

UPDATE (SELECT id FROM table LEFT JOIN category_list ON category_list.category_id=table.category_id LEFT JOIN sub_category_list ON sub_category_list.sub_category_id=table.sub_category_id WHERE table.param_id=xxx ORDER BY category_list.weight,sub_category_list.weight) as t1 LEFT JOIN table ON table.id=t1.id SET table.time=(SELECT @test_t := @test_t + 10)
 
Сверху