为什么在我使用 count() 时 order by 不起作用?

Why order by deosn't work when I use count()?

这是我的查询:

SELECT count(1) all_requests_num, date_time
FROM requests
WHERE user_id = :id
ORDER BY date_time DESC
LIMIT 1

如您所见,我已根据 date_time 降序排列行。但是 date_time 的结果不是最大值。为什么?我该如何解决?


这是一个简化的例子:

// requests
+----+------------+-------------+
| id | other_cols |  date_time  |
+----+------------+-------------+
| 1  | ...        | 1517045060  |
| 2  | ...        | 1517045061  |
| 3  | ...        | 1517045062  |
| 4  | ...        | 1517045063  |
+----+------------+-------------+

date_time 的预期结果是 1517045063,但我上面的查询 returns 1517045060

好的,答案是在 date_time 列上使用 MAX()

SELECT count(1) all_requests_num, MAX(date_time) date_time
FROM requests
WHERE user_id = :id

您的查询使用了 MySQL 的一项(错误)功能,该功能在任何其他数据库中都不起作用。 COUNT() 是聚合函数。如果没有 GROUP BY,它会将查询变成 returns 一行的聚合查询。 LIMIT 1 是多余的 - 删除它并明白我的意思。

您可以使用 ORDER BYLIMIT 以多种方式获得最大值 date_time:

SELECT date_time
FROM requests
WHERE user_id = :id
ORDER BY date_time DESC
LIMIT 1;

这并没有给你计数。为此,仅使用聚合查询(如 Martin 所建议的):

SELECT COUNT(*), MAX(date_time)
FROM requests
WHERE user_id = :id;

令人高兴的是,这个结构可以同时用于所有用户:

SELECT user_id, COUNT(*), MAX(date_time)
FROM requests
GROUP BY user_id;