选择MAX(时间戳)GROUP BY

时间:2015-11-30 00:05:08

标签: mysql

我有下表:

+----+----------+---------+--------+-------+---------------------+
| id | order_id | user_id | status | notes | timestamp           |
+----+----------+---------+--------+-------+---------------------+
|  3 |        1 |       0 |      0 |       | 2015-11-29 22:49:44 |
|  4 |        1 |       0 |      2 |       | 2015-11-29 22:51:51 |
|  5 |        2 |       0 |      0 |       | 2015-11-29 23:14:26 |
|  6 |        3 |       0 |      0 |       | 2015-11-29 23:15:52 |
+----+----------+---------+--------+-------+---------------------+

为什么是以下查询:

SELECT
    order_id,
    `status`,
    MAX(timestamp)
FROM
    order_status
GROUP BY
    order_id

返回以下结果?

+----------+--------+---------------------+
| order_id | status | MAX(timestamp)      |
+----------+--------+---------------------+
|        1 |      0 | 2015-11-29 22:51:51 |
|        2 |      0 | 2015-11-29 23:14:26 |
|        3 |      0 | 2015-11-29 23:15:52 |
+----------+--------+---------------------+

第1行不应该有状态= 2?

2 个答案:

答案 0 :(得分:1)

它返回任何东西的事实是由于MySQL中的怪癖。毕竟,status应该返回什么值?它不包含在GROUP BY中。因此,MySQL从不确定的行返回一个值。大多数其他数据库只会返回错误。

尝试类似:

select os.*
from order_status os
where timestamp = (select max(os2.time_stamp)
                   from order_status os2
                   where os2.order_id = os.order_id
                  );

答案 1 :(得分:0)

这是非常老的,但是我在Google搜索时的第一个搜索结果。 您不需要子选择,这是解决此问题的正确方法。

SELECT
    DISTINCT (order_id),
    status,
    timestamp
FROM
    order_status
ORDER BY order_id, timestamp DESC