为什么在我使用 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 BY
和 LIMIT
以多种方式获得最大值 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;
这是我的查询:
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 BY
和 LIMIT
以多种方式获得最大值 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;