1

私は単純な mysql クエリで立ち往生しています。テーブルの最大 ID を持つ行を更新したいのですが、次のようなことを試みていましたが、うまくいきません

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

サブクエリも試しましたが、どちらも機能しません

それについていくつかの助けが必要です。

ありがとう

4

2 に答える 2

2

MySql では、同じテーブルを参照するサブクエリがある場合、テーブルを更新できませんが、サブクエリを JOINS に置き換えることはできます。私はこれをします、それはトリックですが、うまくいきます:

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

サブクエリは、必要なconversation_idと に基づいて最大 ID を返しますuser_id。次に、最大 ID と結合inboxして必要な行だけを選択すると、その行だけを更新できます。

于 2012-11-10T11:06:33.180 に答える
1

バッククォートのように、MySQL の予約語をエスケープする必要があります。最大記録のみを更新するためにread使用することもできます。limit

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

SQLFiddle の例

于 2012-11-10T10:59:25.383 に答える