在我的聊天应用程序中,我在Android应用程序上使用System.currentTimeMillis()/1000
将消息创建的时间发送到我的MySQL服务器,而没有毫秒部分。现在奇怪的是,我的表有两个具有相同毫秒值的记录。更奇怪的是,当我将毫秒转换为可读时间时,值完全不同!
以下是两个不同查询的输出:
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 :(得分: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;
这将确保选择记录,其中时间戳等于最大时间戳,这将确保您选择正确的记录。处理聚合函数时,您必须为每列指定您想要的哪一个值。
答案 1 :(得分:0)
引用答案 -
它们代表从您的代码中有条件地引用的类,但在Android设备或模拟器上不存在,因为它们是在较新版本的Android中引入的。例如,在API Level 19(Android 4.4)中添加了ArrayMap。这些消息并不代表"崩溃"。