MySQL 计数登录并返回最新登录

标签 mysql count group-by

我有一个非常简单的表:

+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| time     | int(11)      | YES  |     | 0       |       |
| username | varchar(120) | NO   | MUL |         |       |
| ip       | varchar(40)  | NO   | MUL |         |       |
| failed   | varchar(40)  | NO   | MUL |         |       |
+----------+--------------+------+-----+---------+-------+

我想查询几个特定的​​用户,我想要登录计数和最近的登录(如果存在任何登录)。我尝试了“GROUP BY”的各种组合,但没有任何效果。

我的简单计数查询是这样的:

mysql> SELECT count(*), username FROM logins WHERE username='foo@bar.com' and failed='0' group by username;

我怎样才能返回包含计数和上次登录的单行?

如果将时间戳转换为人类友好的格式,则可加分。

编辑:第一个答案对我来说似乎最清楚,而且效果很好。

我也想到了这个,它似乎可以工作并在大约相同的时间内返回,但我不确定我在用嵌套的 SELECT 做什么:

SELECT COUNT(*), username (SELECT MAX(time)) FROM logins WHERE username='foo@bar.com' AND failed='0' GROUP BY username;

并获得人类可读的时间:

SELECT COUNT(*), username (SELECT FROM_UNIXTIME(MAX(time))) FROM logins WHERE username='foo@bar.com' AND failed='0' GROUP BY username;

这个版本和第一个答案中看起来更合适的查询都需要大约 2 分钟 27 秒(该表有大约 1.61 亿行)。

最佳答案

Max(time) 将为您提供最晚的登录时间。请参阅下面的完整查询

SELECT username, 
       COUNT(*)    AS `count`, 
       Max(`time`) AS `latest` 
FROM   logins 
WHERE  username = 'foo@bar.com' 
       AND failed = '0' 
GROUP  BY username; 

关于MySQL 计数登录并返回最新登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9848200/

相关文章:

python - 检查值是否比列表中的 X 更频繁地存在的最快方法

MYSQL 两列在第一列中具有值,我怎样才能进行内部联接

MySQL COUNT(*) GROUP BY HAVING COUNT=?

php - 将另一个表列添加到通过外键链接的查询的结果中

计算 float (hw) C

r - 按组计数高于某个阈值的值

mysql - 选择日期小于指定日期的每组最新行

php - 如何在 PHP 中使用 PDO 获取表的列名

mysql - 为什么我有 "Can' t create table '.\matchingup.frm' (errno : 150)"for such a simple table

php - 基本 mysql/数据存储问题 : information architecture, 代码本身不多