我有下表:
+----+----------+---------+--------+-------+---------------------+
| 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?
答案 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