2012-07-11 27 views
4

我想構建一個MySQL查詢,它將更新我的表中的一行WHERE id最高,並且一個名爲idSession的字段等於65.它看起來像像這樣:MySQL的更新查詢,其中id是最高的,並且字段等於變量

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

而且我收到錯誤消息:

「錯誤代碼:1093您不能指定目標表‘歷史’在FROM子句更新 」。

任何人都知道我的語法有什麼問題嗎?

+0

檢查:http://stackoverflow.com/questions/6944165/mysql-update-with-where- select-subquery-error – Chandu 2012-07-11 13:40:42

回答

16

正是它說:你不能從表中,當你選擇更新基於來自完全相同的表的條件相同的表。 (這是故意混淆的書面:P)

試試這個:

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

可以在UPDATEDELETE查詢使用ORDERLIMIT

+0

不知道你可以在UPDATE和DELETE查詢中使用ORDER和LIMIT。我構建了這個查詢,它的工作原理如下: SELECT'test1' FROM'History' WHERE'id' =(SELECT MAX(ID)FROM'History' WHERE test2 ='var1'AND test3 ='var2'); – AzzyDude 2012-07-11 13:44:56

+0

智能答案:) – 2017-08-04 19:14:12

4

這個怎麼樣:

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

這是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提供的解決方案,改變更新使用(專有MySQL)語法ORDER BYUPDATE語句中。

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 ; 
相關問題