Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > SELECT в UPDATE


Автор: motorway 21.6.2012, 17:32
Как в UPDATE запросе установить значение поля равным некоторой функции от значения того же поля в предыдущей или следующей записи (по ID)?

Автор: Akina 21.6.2012, 19:25
Код

update table t1, table t2
set t1.field1=func(t2.field2)
where t1.id=t2.id+1;
Обрати внимание - field1 и field2 ОБЯЗАНЫ быть РАЗНЫМИ полями. Если необходимо одно и то же поле - введи в структуру копию поля и используй его на стороне field2.
Если же ID - не синтетика, а автоинкремент с дырками - пронумеруй записи в подзапросах.

Автор: motorway 21.6.2012, 19:36
Суть в том, что это одно и то же поле одной таблицы. Менять таблицы нельзя. Есть только вариант со временной таблицей в памяти MySQL. Такой подход поможет в этом случае?

Автор: motorway 21.6.2012, 21:57
Цитата(Akina @ 21.6.2012,  19:25)
Код

update table t1, table t2
set t1.field1=func(t2.field2)
where t1.id=t2.id+1;
Обрати внимание - field1 и field2 ОБЯЗАНЫ быть РАЗНЫМИ полями. Если необходимо одно и то же поле - введи в структуру копию поля и используй его на стороне field2.
Если же ID - не синтетика, а автоинкремент с дырками - пронумеруй записи в подзапросах.

Делаю, так как ты написал - у меня в условии кроме t1.id=t2.id+1 ещё есть where t1.col=0. Использую временную таблицу (копию первой). Работает только если нули не подряд. Если подряд, не обновляет.

Автор: Akina 21.6.2012, 22:54
Цитата(motorway @  21.6.2012,  22:57 Найти цитируемый пост)
у меня в условии кроме t1.id=t2.id+1 ещё есть where t1.col=0. Использую временную таблицу (копию первой). Работает только если нули не подряд. Если подряд, не обновляет. 

А что у тебя ещё такого, о чём ты умалчиваешь? давай сразу всю задачу.

Автор: motorway 21.6.2012, 22:56
Ничего нет больше. Просто надо обновить поля, где 0, взяв предыдущее значение !=0.

Автор: motorway 21.6.2012, 23:40
Почти разобрался через 2 переменные, но не совсем...
Вопрос остаётся.

Автор: Akina 22.6.2012, 08:06
Цитата(motorway @  21.6.2012,  23:56 Найти цитируемый пост)
Ничего нет больше. Просто надо обновить поля, где 0, взяв предыдущее значение !=0.

Допустим, идут подряд (при нужной тебе сортировке) два нуля... чем обновляем первый из них? вторым нулём?

Автор: motorway 22.6.2012, 11:14
При нужной сортировке берем значение поля из строки с более ранним ID, и оттуда берём значение. Если подряд 2 нуля, то такое же значение должно и тут появиться. 

Автор: Akina 22.6.2012, 11:23
Тогда хранимая процедура и курсор. Любое другое решение будет или тяжелее, или при определённых условиях неработоспособно.

Автор: motorway 22.6.2012, 11:45
Если нетрудно, подскажите более подробно, в какую сторону тут копать.

Автор: Akina 22.6.2012, 16:28
http://dev.mysql.com/doc/refman/5.5/en/create-procedure.html
http://dev.mysql.com/doc/refman/5.5/en/declare-cursor.html 

Автор: motorway 22.6.2012, 18:38
А триггером при UPDATE здесь можно обойтись? Уже пробовал такой вариант, но пока не вышло

Автор: Akina 23.6.2012, 23:09
Цитата(motorway @  22.6.2012,  19:38 Найти цитируемый пост)
А триггером при UPDATE здесь можно обойтись? 

Нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)