Обновить одну таблицу на основании данных другой

 
0
 
MySQL
ava
maxipub | 05.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
Ответы (5)
ava
Zloxa | 05.10.2016, 13:56 #
Цитата (maxipub @  5.10.2016,  14:46 findReferencedText)
Почему не хочет выполняться такой запрос?

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

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

UPDATE t1 set t1.total = (select sum(t2.items * t2.price) from t2 where t1.id=t2.td)
ava
maxipub | 05.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
ava
Zloxa | 05.10.2016, 15:24 #
Цитата (maxipub @  5.10.2016,  15:29 findReferencedText)
 Если нужно таким образом изменять не одно, а несколько значений 


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



Цитата (maxipub @  5.10.2016,  15:29 findReferencedText)
2.

тут я пасс, могу лиж предположить что есть строчка, где t2.items > t2.orders, при этом что-то не может принимать отрицательного значения
ava
Akina | 05.10.2016, 15:47 #
Цитата (maxipub @  5.10.2016,  15:29 findReferencedText)
Если нужно таким образом изменять не одно, а несколько значений - это на каждое значение отдельный подзапрос делать, одним не получится?

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


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 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;
ava
maxipub | 06.10.2016, 10:05 #
ZloxaAkina, ребята, спасибо большое, буду разбираться! Вырос на Basic и Pascal, да еще и самоучка-консерватор. Сейчас что ООП, что SQL - очень туго даются, я думаю на другом языке...
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  Akina ava  Zloxa   maxipub
advanced
Отправить