我正在尝试构建一个 MySQL 查询,它将更新我的表中的一行,其中 id 最高,并且名为 idSession 的字段等于 65。它看起来像这样:
UPDATE `History`
SET `state` = 0
WHERE `id` = (SELECT MAX(id) FROM `History` WHERE `idSession` = 65);
我收到错误消息:
“错误代码:1093。您不能在 FROM 子句中指定目标表‘历史’进行更新”。
有人知道我的语法有什么问题吗?
我正在尝试构建一个 MySQL 查询,它将更新我的表中的一行,其中 id 最高,并且名为 idSession 的字段等于 65。它看起来像这样:
UPDATE `History`
SET `state` = 0
WHERE `id` = (SELECT MAX(id) FROM `History` WHERE `idSession` = 65);
我收到错误消息:
“错误代码:1093。您不能在 FROM 子句中指定目标表‘历史’进行更新”。
有人知道我的语法有什么问题吗?
正是它所说的:当您根据完全相同的表中的条件更新同一个表时,您无法从表中进行选择。(这是故意混淆写的:p)
尝试这个:
UPDATE `History` SET `state`=0 WHERE `idSession`=65 ORDER BY `id` DESC LIMIT 1
您可以在和查询中使用ORDER
and ;)LIMIT
UPDATE
DELETE
那这个呢:
UPDATE `History`
SET `state` = 0
WHERE `idSession` = 65
ORDER BY `id` DESC
LIMIT 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
中的(专有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 ;