mysql中多表、order by和limit的update语句

dba5bblo  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(1003)

当我尝试在mysql中运行一个包含多个表和order by and limit的update语句时,如下所示,

CREATE TRIGGER `Percent` AFTER INSERT ON `tbl_products`
FOR EACH ROW BEGIN
UPDATE
tbl_product_rate t1,
  ( SELECT tbl_products.id, (rate * number) AS prt
    FROM tbl_products left join tbl_products_rate on tbl_products.id = tbl_products_rate.id GROUP BY id
  ) t2
SET
  t1.option = t2.prt
WHERE
  t1.id = t2.id ORDER BY t1.id LIMIT 1;
END

我有下面这样的错误,

[Last executed query: EXECUTE mdb2_statement_mysql_142db9909b0277f32407f2a5d4da240eabf37dd822 USING @0]
[Native code: 1221]
[Native message: Incorrect usage of UPDATE and ORDER BY]

有谁能告诉我如何修复上面的update语句,以便order by和limit可以用于具有多个表的update语句?
p、 如果我在没有order by和limit的情况下运行update语句,它将更新表中存在的所有行而不会出错。

lo8azlld

lo8azlld1#

正如mysql手册中的update语句所说:
您还可以执行覆盖多个表的更新操作。但是,不能对多表更新使用order by或limit。
这意味着您需要将多表update语句转换为单表语句才能执行该操作。
在我看来,从查询中,您需要一个值( rate * number )从 tbl_products table。
我不清楚选择标准,因为您是在用于加入的字段上排序的,这意味着该字段对所有记录都具有完全相同的值,并且您没有对分组依据使用任何聚合函数。这意味着您的子查询是针对sql标准的,并且只在mysql中运行,因为您没有惟一的fullgroupbysql模式集。您也没有引用正在更新的记录,因此不知道此查询与当前记录的关系。
因此,我无法建议如何将连接重写为子查询。但这正是您需要做的:将join重写为子查询。

相关问题