首页 > 解决方案 > Mysql更新表与join,groupby和caluse

问题描述

我对更新连接表有疑问。我确实已经成功地选择了预期的结果,但是当我尝试更新时总是收到错误消息。

选择查询

select sale_id, price,cONVERT(sum(price) , decimal(10,2)) as average, s.total from sale_items i
JOIN sales s ON s.id = i.sale_id
where s.currency = 'USD' 
and s.currency_total != 0 
and s.`deleted_at` is null
and i.`deleted_at` is null
group by s.id
having s.total <> average;  

更新我试过的查询

    UPDATE sale_items i
JOIN sales s ON s.id = i.sale_id

SET i.price=(i.price / (s.total/s.currency_total)), i.total=(i.total / (s.total/s.currency_total)), i.total_tax=(i.total_tax / (s.total/s.currency_total))
where s.currency = 'USD' 
and s.currency_total != 0 
and s.`deleted_at` is null
and i.`deleted_at` is null
group by s.id
having s.total <> average;

错误:在“按 s.id 分组,具有 s.total <> 平均值”附近使用的语法

标签: mysqlmysql-5.6

解决方案


在 5.6 中,根据UPDATE的手册页,多表更新有限制,包括没有ORDER BY

average唯一存在于您的查询SELECT中,它未在更新查询中定义。

您需要包含一个子查询来扩展您的位置,例如:

UPDATE sale_items i
JOIN sales s ON s.id = i.sale_id
SET i.price=(i.price / (s.total/s.currency_total)), i.total=(i.total / (s.total/s.currency_total)), i.total_tax=(i.total_tax / (s.total/s.currency_total))
where s.currency = 'USD' 
and s.currency_total != 0 
and s.`deleted_at` is null
and i.`deleted_at` is null
and s.total <> (select sum(price) from sale_items WHERE sale_id = s.id AND ...)`

推荐阅读