如何在MySQL

时间:2016-08-06 05:33:44

标签: mysql

我想在此查询中使用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

2 个答案:

答案 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 
  

14.2.11 UPDATE Syntax

     

单表语法:

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;