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


Автор: maxipub 5.10.2016, 13:46
Добрый день!

Почему не хочет выполняться такой запрос?

Код
UPDATE t1 INNER JOIN t2 ON t1.id=t2.td SET t1.total=SUM(t2.items * t2.price)


#1111 - Invalid use of group function

Автор: Zloxa 5.10.2016, 13:56
Цитата(maxipub @  5.10.2016,  14:46 Найти цитируемый пост)
Почему не хочет выполняться такой запрос?

потому что не правильно используется групповая функция. smile

Сложно сказать что именно имелось в виду этой синтаксически не корректной конструкцией. Вероятно  что-то вроде:
Код

UPDATE t1 set t1.total = (select sum(t2.items * t2.price) from t2 where t1.id=t2.td)

Автор: maxipub 5.10.2016, 14:29
Zloxa, спасибо!

Сразу два подвопроса.

1. Если нужно таким образом изменять не одно, а несколько значений - это на каждое значение отдельный подзапрос делать, одним не получится?

Код
UPDATE t1 set t1.total = (select sum(t2.items * t2.price) from t2 where t1.id=t2.td), t1.shortage = (select sum((t2.orders - t2.items) * t2.price) from t2 where t1.id=t2.td)


2. С этим минусом в сумме опять вылазит ошибка #1690 BIGINT UNSIGNED, не пойму это Denwer или он тут не при чем... t1.shortage не UNSIGNED, SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; http://forum.vingrad.ru/forum/topic-377865.html

Автор: Zloxa 5.10.2016, 15:24
Цитата(maxipub @  5.10.2016,  15:29 Найти цитируемый пост)
 Если нужно таким образом изменять не одно, а несколько значений 

Код

   set (t1.val1, t1.val2) = (select val1, val2 from.... )



Цитата(maxipub @  5.10.2016,  15:29 Найти цитируемый пост)
2.

тут я пасс, могу лиж предположить что есть строчка, где t2.items > t2.orders, при этом что-то не может принимать отрицательного значения

Автор: Akina 5.10.2016, 15:47
Цитата(maxipub @  5.10.2016,  15:29 Найти цитируемый пост)
Если нужно таким образом изменять не одно, а несколько значений - это на каждое значение отдельный подзапрос делать, одним не получится?

Да легко. Просто надо иногда заглядывать в мануал, он покажет правильный синтаксис (в частности, узнаешь, что UPDATE не знает о существовании GROUP BY). И понимать, что групповые операции быстрее итерационных, лучше сначала подготовить все данные, а потом всё сразу обновить, чем делать это по одному значению.
Цитата(maxipub @  5.10.2016,  15:29 Найти цитируемый пост)
Код

UPDATE t1 
set t1.total = (select sum(t2.items * t2.price) from t2 where t1.id=t2.td), 
t1.shortage = (select sum((t2.orders - t2.items) * t2.price) 
from t2 
where t1.id=t2.td)

С учётом написанного выше это будет, например, так:
Код

UPDATE t1,
       (
       SELECT id,
              SUM(items*price) AS total, 
              SUM(price*(orders-items)) AS shortage
       FROM t2
       GROUP BY t2.id
       ) AS t3
SET t1.total=t3.total,
    t1.shortage=t3.shortage
WHERE t1.id = t3.id;

Автор: maxipub 6.10.2016, 10:05
ZloxaAkina, ребята, спасибо большое, буду разбираться! Вырос на Basic и Pascal, да еще и самоучка-консерватор. Сейчас что ООП, что SQL - очень туго даются, я думаю на другом языке...

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