2013-03-30 14 views
5

Próbuję zaktualizować najnowszy rekord, którego nazwa to John (John ma wiele rekordów, ale inny identyfikator), ale wydaje się być w wiązaniu. Co jest nie tak z moim zapytaniem?Mysql: Zaktualizuj pole najnowszego rekordu

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

Czy istnieje lepszy sposób na zrobienie czegoś takiego?

Odpowiedz

4

Możesz dołączyć do obu i wykonać aktualizację na podstawie warunku.

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' 

Bez warunku WHERE. Zostanie zaktualizowana kolumna is_unread dla najnowszego wpisu.

+0

Niestety, otrzymuję komunikat "Kod błędu: 1064". – enchance

+0

jaki jest pełny komunikat o błędzie? –

+0

'Zapytanie: aktualizacja wiadomości s1 zestaw is_unread = 1 wewnętrzne dołączenie (WYBIERZ nazwę, MAX (ReceiveTime) max_time Z grupy komunikatów przez Messa ... Kod błędu: 1064 Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada do twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu 'wewnętrznego łączenia (SELECT Name, MAX (ReceiveTime) max_time FROM messages group' at line 2' – enchance

22

Możesz spróbować użyć ORDER i LIMIT.

Spróbuj tego:

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

To zapytanie będzie zaktualizować wiersze w kolejności najwyższy (najnowsza) ReceiveTime do najniższego (najstarszego) ReceiveTime. Używane w połączeniu z LIMIT, tylko najnowsze ReceiveTime zostaną zmienione.

+0

Przepraszam, zaktualizowałem moje wyjaśnienie. Nie twoja wina. – enchance

+0

@enchance - Nie ma problemu, chciałem tylko upewnić się, że moja odpowiedź była nadal odpowiednia dla twojego pytania :). – Aiias

Powiązane problemy