mysql - 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 <> 平均值”附近使用的语法
解决方案
在 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 ...)`
推荐阅读
- javascript - 从 Object 中获取所有子项
- c# - C# SpreadSheetGear:#NAME?如果公式应用于单元格,则为文本
- android - AdMob MobileAds.initialize() 赞成和反对
- java - 我正在创建一个 android 项目,它将保存用户的用户名和密码,在设备上运行应用程序时出现错误
- java - URL 请求没有返回数据 - Java
- php - 如何在 single.php 中自定义 Wordpress 帖子导航链接默认模板?
- android - 何时在 Android AccessibilityService 中使用 event.getSource() 和 getRootInActiveWindow()
- objective-c - 在视图控制器之间传递字符串
- angular - 为什么我必须手动映射 SystemJS 配置文件中的所有 d3.js 依赖项?
- android - 如何获取所有前台应用程序?