我想在此查询中使用order by
:
update mytable cross join
(select @i := 0) params
set mydate = mydate + interval 10 * (@i := @i + 1) hour;
我的引用来自this question,因为在那个问题中我想命令PID降序,
update mytable cross join
(select @i := 0) params
set mydate = mydate + interval 10 * (@i := @i + 1) hour order by PID desc;
但是通过该查询,我得到了ERROR 1221 (HY000): Incorrect usage of UPDATE and ORDER BY
原始查询工作正常,但我无法使用order by
。
答案 0 :(得分:6)
如下所示:
UPDATE mytable MT
INNER JOIN
(
SELECT
*,
@i := @i + 1 AS paramNumber
FROM
mytable
cross join(select @i := 0) params
ORDER BY PID DESC
) AS t
ON MT.PID = t.PID
SET MT.mydate = MT.mydate + INTERVAL (10 * (t.paramNumber)) HOUR
单表语法:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
多表格语法:
UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]
对于多表语法,UPDATE更新每个名为的表中的行 在table_references中满足条件。每个匹配的行是 更新一次,即使它多次符合条件。对于 多表语法,ORDER BY和LIMIT不能使用。
答案 1 :(得分:3)
MySQL不允许在带有JOIN的UPDATE语句中使用ORDER BY
。但是你可以通过将你的陈述分成两部分来避免JOIN:
set @i := 0;
update mytable
set mydate = mydate + interval 10 * (@i := @i + 1) hour
order by PID desc;
在没有JOIN的情况下将其保留在一个语句中的一种棘手的方法是在ORDER BY子句中初始化@i
:
update mytable
set mydate = mydate + interval 10 * (@i := @i + 1) hour
order by PID desc, @i := 0;