2013-03-30 13 views
5

Ich versuche, den neuesten Datensatz zu aktualisieren, wo der Name John (John hat mehrere Datensätze, aber unterschiedliche ID), aber ich bin offenbar in einer Bindung. Was ist falsch an meiner Anfrage?Mysql: Update-Feld der meisten neuesten Datensatz

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

Gibt es eine bessere Möglichkeit, so etwas zu tun?

Antwort

4

Sie können beide beitreten und ein Update basierend auf der Bedingung durchführen.

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' 

Ohne den WHERE Zustand. Es wird alles aktualisiert die Spalte is_unread für den neuesten Eintrag.

+0

Sorry, ich bekomme einen 'Fehlercode: 1064'. – enchance

+0

Was ist die vollständige Fehlermeldung? –

+0

'Abfrage: Update Nachrichten s1 Satz is_unread = 1 innerer Join (SELECT Name, MAX (ReceiveTime) max_time FROM Nachrichten Gruppe von Messa ... Fehlercode: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax, überprüfen Sie das entsprechende Handbuch zu Ihrer MySQL-Server-Version für die richtige Syntax zu verwenden in der Nähe 'innere Join (SELECT-Name, MAX (ReceiveTime) max_time FROM Nachrichtengruppe' in Zeile 2 ' – enchance

22

Sie könnten versuchen, ORDER und LIMIT zu verwenden.

Versuchen Sie folgendes:

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

Diese Abfrage wird die Zeilen in der Reihenfolge der höchsten (letzten) ReceiveTime auf die niedrigste (älteste) ReceiveTime aktualisieren. In Verbindung mit LIMIT wird nur das letzte ReceiveTime geändert.

+0

Entschuldigung, ich habe meine Erklärung aktualisiert. Nicht deine Schuld. – enchance

+0

@enchance - Kein Problem, wollte nur sicherstellen, dass meine Antwort noch relevant für Ihre Frage war :). – Aiias

Verwandte Themen