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