【问题标题】:Update statement with multiple tables and Order By and LIMIT in mySql在 mySql 中使用多个表和 Order By 和 LIMIT 更新语句
【发布时间】:2018-04-16 04:51:28
【问题描述】:

当我尝试在 mySql 中运行包含多个表和 Order By 和 LIMIT 的更新语句时,如下所示,

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]


谁能告诉我如何修复上述更新语句,以便 order by 和 limit 可用于更新语句 有多张桌子?

附言如果我在没有 ORDER BY 和 LIMIT 的情况下运行更新语句,它将更新表中存在的所有行而不会出现错误。

【问题讨论】:

    标签: mysql sql-order-by limit


    【解决方案1】:

    正如mysql手册上的更新语句所说:

    您还可以执行覆盖多个表的 UPDATE 操作。但是,您不能将 ORDER BY 或 LIMIT 与多表 UPDATE 一起使用。

    这意味着您需要将多表更新语句转换为单表语句才能执行操作。

    在我看来,您需要来自 tbl_products 表的单个值 (rate * number)。

    我不清楚选择标准,因为您在用于加入的字段上进行排序,这意味着该字段对于所有记录将具有完全相同的值,并且您不使用任何聚合函数与您的分组依据。这意味着您的子查询违反 sql 标准并且仅在 mysql 中运行,因为您没有唯一的完整 group by sql 模式集。您也没有参考正在更新的记录,因此不知道此查询与当前记录有何关系。

    因此,我无法建议如何将连接重写为子查询。但这就是您需要做的:将您的联接重写为子查询。

    【讨论】:

    • 谢谢,Shadow,我简化了部分,(rate * number) 用于发布目的,因为计算太长且令人困惑。我仍然很困惑我应该如何以及在哪里在我的代码上使用子查询,如果你能向我展示一个完全不必准确的示例,我将不胜感激。只是“我的情况”中的一个想法,以便我根据“我的情况”使其工作。
    • 正如我在回答中所写,我无法提出解决方案,因为我不明白您想要达到的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2014-05-08
    • 2017-09-12
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多