当我使用count()时为什么命令不起作用?

时间:2018-01-27 09:44:19

标签: mysql sql sql-order-by

这是我的问题:

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,但上面的查询返回1517045060

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您的查询使用的MySQL(错误)功能无法在任何其他数据库中使用。 COUNT()是一个聚合函数。如果没有GROUP BY,它会将查询转换为返回一行的聚合查询。 LIMIT 1是多余的 - 删除它并查看我的意思。

您可以使用date_timeORDER BY以多种方式获得最大LIMIT

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;