Обновление таблици значениями другой таблици

ttp

Guest
Обновление таблици значениями другой таблици

Задача:
Есть три таблици:
1) табл1(ид2,значение)
2) табл2(ид,слот1,слот2)
3) табл3(ид,знач)
Нужно обновить табл3.знач взяв суму значений из табл1 связаной по табл2.слот1=табл1.ид2 и табл2.слот2=табл1.ід2
или компактно where табл1.ид2 in (табл2.слот1,табл2.слот2) одним запросом.
Что-то типа:
update табл3,табл2,табл1
set табл3.знач=sum(табл1.значение)
where табл3.ид in(...)
and табл1.ід in(табл2.слот1, табл2.слот2)
and табл3.ид=табл2.ид
group by табл2.ид;

верхний запрос я написал только для понимания сути вопроса
 

camka

не самка
Попробуй напиши сначала запрос на выборку (select), где выбирается то поле, которое ты хочешь обновить и значение, которое ты хочешь ему присвоить. Проверь правильность данных в выборке. Потом по аналогии строй запрос на обновление (update). Синтаксис обновления с несколькими таблицами должен совпадать с синтаксисом простой выборки. И, насколько я помню, группировка там тоже поддерживается (хотя могу ошибаться).
 

Sherman

Mephi
табл2.слот1=табл1.ид2 и табл2.слот2=табл1.ід2

табл2.слот1= табл2.слот2

?

=>

sum = (2*табл2.слот1)
 

camka

не самка
Приведи запрос, на который выдается ошибка и текст самой ошибки.
 

ttp

Guest
Структура:
PHP:
+-------------+ +---------------+
|---table1----| |---table2------|
+-----+---+---+ +---+-----+-----+
|slots|zn1|zn2| |id |slot1|slot2|
+-----+---+---+ +---+-----+-----+
|  1  | 2 | 1 | | 1 |  1  |  3  |
|  2  | 4 | 2 | | 2 |  2  |  4  |
|  3  | 3 | 2 | | 3 |  3  |  2  |
|  4  | 2 | 3 |

+-----------+
|---table4--|
+---+---+---+
|id |zn1|zn2|
+---+---+---+
| 1 | 2 | 3 |
| 2 | 3 | 1 |
| 3 | 1 | 2 |
После выполнения запроса
[SQL]
select table2.id,sum(table1.zn1)+table4.zn1 as s1, sum(table1.zn2)+table4.zn2 as s2
from table1,table2,table4
where table2.id in(1,2,3)
and table2.id=table4.id
and table1.slots in(table2.slot1,table2.slot2)
group by table2.id;
[/SQL]
получаем даные
PHP:
+--+--+--+
|id|s1|s2|
+--+--+--+
|1 |6 |6 |
|2 |9 |6 |
|3 |7 |6 |
+--+--+--+
которие по полученому иденитификатору нужно вставить в следующую таблицу
PHP:
+-----------+
|---table3--|
+---+---+---+
|id |zn1|zn2|
+---+---+---+
| 1 | 0 | 0 |
| 2 | 0 | 0 |
| 3 | 0 | 0 |
+---+---+---+
Но нужно все это сделать одним запросом. Я пытаюсь уже не трогать четвертую таблицу значения из которой нужно добавлять к найденым сумам и делаю следующий запрос:
[SQL]
update table1,table2,tables3
set table3.zn1=sum(table1.zn1),
table3.zn2=sum(table1.zn2)
where table2.id in(1,2,3)
and table1.slots in(table2.slot1,table2.slot2)
group by table2.id;
[/SQL]
и получаю следующий ответ
PHP:
You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'group by table2.id' at line 6
Что ему не нравится м моей групировке???
 

camka

не самка
Попробовал подобный запрос на своей базе. Похоже, что явная группировка в запросе на обновления не пройдет.

Код:
Multiple-table syntax: 

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]
Если версия позволяет, то можно выкрутиться с подзапросами, и группировать внутри подзапроса.
 

ttp

Guest
Автор оригинала: camka
Если версия позволяет, то можно выкрутиться с подзапросами, и группировать внутри подзапроса.
Пробовал и с подзапросами, тоже нефига не выходит. Если у тебя получилось напиши запрос по примеру, который я навел.
 

camka

не самка
Честно признаться, я не достаточно разобрался в том, что ты желаешь вычислить. Но при беглом взгляде на UPDATE не видать, где определяется связь конкретной записи из таблицы3 и двумя остальными таблицами, то есть в условиях объединения нигде не упомянута таблица3.

-~{}~ 15.06.05 13:39:

Рискну предположить, что подразумевалось нечто подобное:

[sql]

UPDATE t3, (select t2.id, sum(t1.zn1) as s1, sum(t1.z2) as s2 from t1, t2 where t2.id in (1,2,3) and t1.slots in (t2.slot1, t2.slot2) group by t2.id) tx set t3.zn1=tx.s1, t3.zn2=tx.s2 where t3.id = tx.id;
[/sql]
 

ttp

Guest
Автор оригинала: camka
Я принцип понял, а ты проверял этот метод? Я по этому же принципу склепал свой, и на SELECT выдает ошибку. Можно ли вообще так делать.
Знаю что так
[SQL]set table3.zn1=(select ...)[/SQL]
вроде можно но у меня и так не выходит :(
 
Сверху