2016-05-25 13 views
0

In meiner Chat-Anwendung verwende ich System.currentTimeMillis()/1000 auf der Android-App, um die Zeit zu senden, die die Nachricht an meinem MySQL-Server erstellt wurde, ohne den Millisekunden-Teil. Jetzt ist der komische Teil, meine Tabelle hat zwei Datensätze mit dem gleichen Wert von Millisekunden. Noch seltsamer ist, dass, wenn ich die Millisekunden in lesbare Zeit umwandle, die Werte völlig verschieden sind!
Hier ist die Ausgabe von zwei verschiedenen Anfragen:MySQL TIMESTAMP verhält sich seltsam

SELECT max(UNIX_TIMESTAMP(created_at)), created_at, message FROM messages WHERE mtype = 0 AND groups_id = 1; 

max(UNIX_TIMESTAMP(created_at)) | created_at   | message | 
+--------------------------------+---------------------+---------+ 
|      1464096148 | 2016-04-25 13:57:18 | The 


SELECT UNIX_TIMESTAMP(created_at), created_at, MESSAGE FROM messages WHERE mtype = 0 AND groups_id = 1 ORDER BY created_at DESC LIMIT 1; 

max(UNIX_TIMESTAMP(created_at)) | created_at   | message | 
+--------------------------------+---------------------+---------+ 
|      1464096148 | 2016-05-24 18:52:28 | test 

Der Ausgang der letzten Abfrage ist das, was ich von meiner Client-Anwendung Speicher senden.

+0

Ich sehe kein Problem hier sollte es anders sein, sind Sie die Auswahl der max eine in der ersten Abfrage, die wahrscheinlich zu '2016-05-24' – sagi

+0

gehört @ Sagi bitte sehen Sie den Wert von Millisekunden in der ersten Spalte, sie sind völlig gleich. Und dann überprüfen Sie die 2. Spalte ist völlig anders. –

+0

Warum werden sie nicht? Sie haben mehr als einen Datensatz. Wenn Sie also MAX() auswählen, wird der maximale Zeitstempel ausgewählt. Die anderen Spalten ohne Gruppenklausel und Aggregationsfunktion werden zufällig ausgewählt. – sagi

Antwort

1

Nichts wirkt komisch, es verhält sich genau so, wie es sein sollte.

Wenn Sie mehr als einen Datensatz haben, und Sie eine Aggregationsfunktion wie MAX()/MIN()/COUNT()... verwenden, wenn die anderen Spalten ohne die Aggregationsfunktion unterschiedliche Werte hat, wird einer von ihnen ausgewählt werden (nicht sicher, um welche Reihenfolge, denke ich zufällig)).

Also, wenn Sie sie mögen würde die gleiche Sache zurückkehren, ist dies die Abfrage, die Sie verwenden sollten:

SELECT UNIX_TIMESTAMP(created_at), created_at, message FROM messages 
WHERE UNIX_TIMESTAMP(created_at) =(SELECT max(UNIX_TIMESTAMP(created_at)) 
            FROM messages WHERE mtype = 0 AND groups_id = 1) 
    and mtype = 0 AND groups_id = 1; 

Dies wird sicherstellen, um den Datensatz zu holen, wo der Zeitstempel auf den maximalen Zeitstempel gleich, diese wird sicherstellen, dass Sie den richtigen Datensatz auswählen. Wenn Sie mit Aggregationsfunktionen arbeiten, müssen Sie für jede Spalte den gewünschten Wert angeben.

+0

Danke! Ich muss verrückt sein, solche Dinge auszusuchen. Die SQL-Abfrage, die zufällig die zweite Spalte auswählte, machte mich wahnsinnig. Stört es Sie, wenn ich diese Frage lösche? –

+0

Kein Problem, und nein, mach was du willst. @AkashAggarwal – sagi

+0

Ich dachte, ich würde ein schlechtes Beispiel setzen, aber ein schlechtes Beispiel ist auch ein gutes Beispiel. Ich möchte für jeden, der diese Frage liest, hinzufügen, dass Sie nicht die Funktion 'UNIX_TIMESTAMP()' auf beiden Seiten der 'WHERE'-Bedingung aufrufen müssen. –

0

die Antwort-

Klassen Sie stellen Zitiert, die aus dem Code bedingt bezeichnet werden, aber nicht existieren auf dem Android-Gerät oder Emulator, weil sie in neueren Versionen von Android eingeführt wurden. ArrayMap zum Beispiel wurde in API Level 19 (Android 4.4) hinzugefügt. Diese Nachrichten stellen keinen "Kollaps" dar.

Quelle: Comment on the question

Verwandte Themen