2013-03-30 23 views
5

Sto cercando di aggiornare l'ultimo record in cui il nome è John (John ha più record ma ID diversi) ma mi sembra di essere in un vincolo. Cosa c'è di sbagliato nella mia domanda?Mysql: campo di aggiornamento del record più recente

UPDATE messages_tbl SET is_unread=1 
WHERE ReceiveTime = (SELECT MAX(ReceiveTime) FROM messages_tbl WHERE name='John') 

C'è un modo migliore per fare qualcosa di simile?

risposta

4

È possibile partecipare a entrambi e eseguire l'aggiornamento in base alle condizioni.

UPDATE messages a 
     INNER JOIN 
     (
      SELECT name , MAX(ReceiveTime) max_time 
      FROM messages 
      GROUP BY name 
     ) b ON a.name = b.name AND 
       a.ReceiveTime = b.max_time 
SET  a.is_unread = 1 
-- WHERE a.name = 'John' 

Senza la condizione WHERE. Aggiornerà tutti la colonna is_unread per l'ultima voce.

+0

Mi dispiace, sto ricevendo un 'Codice errore: 1064'. – enchance

+0

qual è il messaggio di errore completo? –

+0

'Query: aggiorna i messaggi s1 set is_unread = 1 inner join (SELECT Name, MAX (ReceiveTime) max_time FROM message group di Messa ... Error Code: 1064 Hai un errore nella sintassi SQL, controlla il manuale che corrisponde per la tua versione del server MySQL per la sintassi corretta da usare vicino 'inner join (SELECT Name, MAX (ReceiveTime) max_time FROM gruppo di messaggi' alla riga 2 ' – enchance

22

Si potrebbe provare a utilizzare ORDER e LIMIT.

Prova questo:

UPDATE messages_tbl SET is_unread = 1 
WHERE name = 'John' 
ORDER BY ReceiveTime DESC 
LIMIT 1 

Questa query aggiornerà le righe in ordine del più alto (più recente) ReceiveTime al più basso (più vecchia) ReceiveTime. Utilizzato in combinazione con LIMIT, verrà modificato solo il più recente ReceiveTime.

+0

Spiacente, ho aggiornato la mia spiegazione. Non è colpa tua. – enchance

+0

@enchance - Non è un problema, volevo solo assicurarmi che la mia risposta fosse ancora pertinente alla tua domanda :). – Aiias

Problemi correlati