MYSQL 计数行直到最后一个不同的行

标签 mysql sql

我有一个表单中的事件表:

|  User  |     Event         |   Date  |
| User A | Failed Log In     |   ...   | 
| User A | Failed Log In     |   ...   |
| User B | Failed Log In     |         |
| User A | Successful Log In |         |
| User B | Successful Log In |         |

我想做的是计算每个用户自上次“成功登录”以来 的所有“失败登录”,以便我可以创建以下形式的 View :

|  User  | Failed Log in attempts |
| User A |            2           |
| User B |            1           |

这可以用 SQL 实现吗?或者我是否需要将此逻辑提取到我的应用程序中?

最佳答案

SQL 表表示无序 集,因此除非列指定顺序,否则没有“最后”或“之前”。因此,这个答案假定某种包含该信息的 eventdatetime 列,尽管自动递增的 id 也同样有效(甚至可能更好)。

我认为这可以满足您的需求:

select e.user, count(*) as NumFailedAttempts
from events e
where e.event = 'Failed Log In' and
      e.eventdatetime > (select max(e2.eventdatetime)
                         from events e2
                         where e2.user = e.user and e2.event = 'Successful Log In'
                        );

如果你想包括零(没有失败登录的那些),那么你可以将其左连接到用户表。

关于MYSQL 计数行直到最后一个不同的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35670647/

相关文章:

mysql - 使用 SELECT CASE 和 SUM : MYSQL

sql - 参数异常 : Keyword not supported: 'server'

php - 一个大查询还是几个小查询?

mysql - 将 CSV 数据导入 SQL 数据库

mysql - 正确的数据库设计 : One table to Multiple Objects

MySQL ERROR 1072 : States Key doesn't exist, 但它确实存在

python - PyQt5 QSqlTableModel 不更新对数据库的更改

sql - 我可以在 mysql 4.0.27 中使用 contains 函数吗?

mysql - SQL Join 语句在 where 子句上失败

mySQL - 将结果转换为字符串