12

我正在尝试构建一个 MySQL 查询,它将更新我的表中的一行,其中 id 最高,并且名为 idSession 的字段等于 65。它看起来像这样:

UPDATE `History` 
SET `state` = 0 
WHERE `id` = (SELECT MAX(id) FROM `History` WHERE `idSession` = 65);

我收到错误消息:

“错误代码:1093。您不能在 FROM 子句中指定目标表‘历史’进行更新”。

有人知道我的语法有什么问题吗?

4

3 回答 3

29

正是它所说的:当您根据完全相同的表中的条件更新同一个表时,您无法从表中进行选择。(这是故意混淆写的:p)

尝试这个:

UPDATE `History` SET `state`=0 WHERE `idSession`=65 ORDER BY `id` DESC LIMIT 1

您可以在和查询中使用ORDERand ;)LIMITUPDATEDELETE

于 2012-07-11T13:42:05.607 回答
6

那这个呢:

UPDATE `History`
SET `state` = 0
WHERE `idSession` = 65
ORDER BY `id` DESC 
LIMIT 1
于 2012-07-11T13:41:55.500 回答
2

这是对 MySQL 的模仿。有两种解决方法(实际上是三种,但我不喜欢第三种)。

1)因为查询:

SELECT MAX(id) 
FROM History 
WHERE idSession = 65

产生与以下相同的结果:

SELECT id 
FROM History 
WHERE idSession = 65
ORDER BY id DESC
  LIMIT 1

您可以使用@xdazz 和@Kolink 提供的解决方案,将更新更改为使用语句ORDER BY中的(专有MySQL)语法UPDATE

2)第二种方法是用上面的子查询加入你的表。这适用于更复杂的条件/子查询/连接,不能用简单的 Order By 重写:

UPDATE 
      History AS h
  JOIN
      ( SELECT MAX(id) AS max_id 
        FROM History 
        WHERE idSession = 65
      ) AS m
    ON m.max_id = h.id
SET h.state = 0 ;
于 2012-07-11T14:03:47.773 回答