2012-11-10 71 views
1

我只是堅持了一個簡單的MySQL查詢,我想更新其表的最大編號的行,我試圖像,但它不工作Max在where子句更新MySQL的

UPDATE inbox i 
INNER JOIN messages m ON i.message_id = m.id 
SET i.read = 0 
WHERE m.conversation_id = 10 
AND i.user_id = 1 
ORDER BY i.id DESC 
LIMIT 1 

我也試過子查詢,但它不起作用要麼

需要一些幫助。

感謝

+0

對不起,我的錯誤,有一個加入我的更新查詢,所以我沒有把正確的查詢之前 – MZH

回答

2

在MySQL如果你有一個子查詢引用同一個表,你無法更新表,但使用連接,你可以sostitute子查詢。我會做這個,這是一個伎倆,但它的工作原理:

UPDATE 
    inbox inner join (select max(id) as maxid from inbox) mx on inbox.id = mx.maxid 
SET inbox.`read` = 0 

編輯:我看到你編輯你的問題,所以我必須修改我的答案是:

UPDATE 
    inbox 
    INNER JOIN (select max(inbox.id) as maxid 
       from 
       inbox inner join messages 
       on inbox.message_id = messages.id 
       where 
       messages.conversation_id=10 
       and inbox.user_id=1) mx 
    on inbox.id = mx.maxid 
SET inbox.`read` = 0 

你的子查詢返回的最大ID的基礎上conversation_iduser_id你想要的,那麼你加入inbox與最大的ID來選擇你想要的行,然後你可以更新那一行。

+0

我還發現這個解決方案,用不同的方法:http://stackoverflow.com/questions/1513206/update-multiple-rows - 使用限制功能於MySQL,但我喜歡我的解決方案的更多:) – fthiella

+0

感謝回答,我已經試過其更新 收件箱我 INNER JOIN(SELECT MAX(inbox.id)AS maxid 從收件INNER JOIN消息 ON inbox.message_id = messages.id WHERE messages.conversation_id = 10 和inbox.user_id = 1)MX ON inbox.id = mx.maxid SET i.read = 0,但我發現未知列「收件箱.id''on'子句' – MZH

+0

如果我把它放在max(id)而不是max(inbox.id),它會在字段中給出Column'id'列表不明確 – MZH

1

你需要逃避reserved words in MySQLread與反引號。您也可以使用limit更新最大記錄。

UPDATE inbox 
SET `READ` = 0 
order by id desc 
limit 1 

SQLFiddle example

+0

這真的有用嗎?我不知道你可以在'UPDATE'語句中添加'ORDER BY'子句。 – Pedigree

+0

它正在工作。見[這裏](http://sqlfiddle.com/#!2/998b1/1) –