2016-05-25 7 views
0

В моем приложении для чата я использую приложение Android для отправки времени, когда сообщение было создано на моем сервере MySQL, без части миллисекунды. Теперь странная часть, моя таблица имеет две записи с одинаковым значением миллисекунд. Еще страннее то, что когда я конвертирую миллисекунды в удобочитаемое время, значения совершенно разные!
Вот вывод из двух разных запросов:MySQL TIMESTAMP ведет себя странно

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 

Выход последнего запроса, что я помню, посылая от моего клиента приложения.

+0

Я не вижу здесь никаких проблем, она должна быть разной, вы выбираете максимальную один в первом запросе, который, вероятно, принадлежит к '2016-05-24' – sagi

+0

@ sagi, пожалуйста, см. значение миллисекунд в первом столбце, они абсолютно одинаковы. И затем проверьте, что второй столбец совершенно другой. –

+0

Почему? у вас более одной записи, поэтому, когда вы выберете 'MAX()', она выберет максимальную метку времени! Остальные столбцы без предложения group by и функции агрегации будут выбраны случайным образом. – sagi

ответ

1

Ничто не действует странно, оно действует точно так, как должно быть.

Если у вас есть более одной записи, и вы используете функцию агрегации, такую ​​как MAX()/MIN()/COUNT()..., если другие столбцы без функции агрегации имеют разные значения, один из них будет выбран (не уверен, в каком порядке, я думаю, случайным образом).

Так что если вы хотели бы, чтобы вернуть ту же вещь, это вопрос, вы должны использовать:

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; 

Это удостоверится, чтобы выбрать запись, где отметка времени равна максимальной отметки времени, это убедитесь, что вы выбрали правильную запись. Когда вы работаете с функциями агрегации, вы должны указать для каждого столбца, какое одно из значений вы хотите.

+0

Спасибо! Я должен быть сумасшедшим, чтобы попытаться выбрать такие вещи. SQL-запрос, который выбирал второй столбец случайным образом (вероятно), был тем, что сбило меня с ума. Не возражаете, если я удалю этот вопрос? –

+0

Нет проблем, и нет, сделайте все, что захотите. @AkashAggarwal – sagi

+0

Я думал, что создаю плохой пример, но неплохой пример тоже хороший пример. Я хотел бы добавить для тех, кто читает этот вопрос, что вам не нужно вызывать функцию 'UNIX_TIMESTAMP()' в любой из сторон условия 'WHERE'. –

0

Цитируя ответа-

Они представляют классы, которые условно указанные в коде, но не существует на Android устройстве или эмуляторе, потому что они были введены в более новых версиях Android. Например, ArrayMap был добавлен в API уровня 19 (Android 4.4). Эти сообщения не представляют собой «крах».

Источник: Comment on the question

Смежные вопросы