0

为什么以下查询不起作用,这绝对超出了我的想法:

DELETE orig FROM revision AS orig JOIN (
  SELECT id
  FROM revision 
  GROUP BY id 
  HAVING COUNT(*) > 1
) AS joined ON orig.id = joined.id
WHERE orig.id=1 
ORDER BY orig.delta ASC 
LIMIT 1

错误在第 8 行抛出,所以ORDER BY子句。但是,我看不出它有什么问题(该表revision确实有一个名为 的列delta)。此外,更改DELETE origSELECT *会导致完美的工作命令。

是否可能delta未加载 -column?或者是什么导致了这个错误?


编辑

好吧,我不知道您不能在查询中使用ORDER BY多行。DELETE

好吧,我想要完成的是我删除了表中的一行,该行的 id 出现多次(在生产中将是 5)并且具有该 id 的所有行的最小增量。

即我在修订表中有两行,都具有相同的ID。我现在想删除两者中增量最小的那一行。这应该是可扩展的,因此我删除了所有行(具有相同的 id),但只有一个(具有最高增量的行)。

4

2 回答 2

2

如果您的 DELETE 语句中有多个表,则不能使用 ORDER BY

于 2013-10-19T19:07:37.953 回答
1

我认为这就是你想要做的。(id,delta)仅当组合具有唯一约束时,它将仅删除 1 行:

DELETE orig 
FROM revision AS orig 
  JOIN 
    ( SELECT MIN(delta) AS delta
      FROM revision 
      WHERE id = 1
      HAVING COUNT(*) > 1
    ) AS joined ON orig.delta = joined.delta
WHERE orig.id = 1 ;

id要删除除最高的(比如说5)行之外的所有行(相同的) delta,您可以使用:

DELETE orig 
FROM revision AS orig 
  JOIN 
    ( SELECT delta
      FROM revision 
      WHERE id = 1
      ORDER BY delta DESC
      LIMIT 1 OFFSET 4                         -- select the 5th highest
    ) AS joined ON orig.delta < joined.delta   -- then find the lower than that
WHERE orig.id = 1 ;
于 2013-10-19T19:19:40.910 回答