MySQL UPDATE查询,其中id最高AND字段等于变量

时间:2012-07-11 13:37:03

标签: mysql

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

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

我收到错误消息:

  

“错误代码:1093。您无法为更新指定目标表'历史'   在FROM子句“。

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

3 个答案:

答案 0 :(得分:22)

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

试试这个:

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

您可以在ORDERLIMIT查询中使用UPDATEDELETE;)

答案 1 :(得分:5)

这个怎么样:

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

答案 2 :(得分:1)

这是一个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语句中UPDATE的{​​专有MySQL)语法。

2)第二种方法是将你的表与上面的子查询连接起来。这适用于更复杂的条件/子查询/连接,无法通过简单的顺序重写:

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 ;