Mysql 在特定行之后计算行数

Mysql 在特定行之后计算行数,mysql,sql,subquery,left-join,Mysql,Sql,Subquery,Left Join,表users有三列:id、name、pass 另一个表logins有user\u id列,一个isrightboolean(tinyint)列,表示登录是否成功,还有一个date列 我需要一个简单的左连接,以获取用户名和密码(1)、上次登录日期时间(成功与否)(2),以及特定用户自上次成功登录以来的登录次数(3) (1) (2)我可以使用 SELECT name, pass, MAX(date) FROM users LEFT JOIN logins ON logins.id = users.i

users
有三列:
id、name、pass

另一个表
logins
user\u id
列,一个
isright
boolean(tinyint)列,表示登录是否成功,还有一个
date

我需要一个简单的
左连接
,以获取用户名和密码(1)、上次登录日期时间(成功与否)(2),以及特定用户自上次成功登录以来的登录次数(3)

(1) (2)我可以使用

SELECT name, pass, MAX(date)
FROM users
LEFT JOIN logins ON logins.id = users.id
-- here either "GROUP BY users.id" or "WHERE users.id = 1234"
但(3)似乎更难。我在谷歌上搜索了一下,发现了许多类似的问题,但没有一个是在特定条件成立后,如何准确地计算行数。(更复杂的是——统计该用户的登录次数,而不是每个人)

我甚至不知道如何在一个单独的查询中实现这一点(我更喜欢对这三件事使用一个查询,我想我必须使用一个子查询,尽管我更喜欢联接)

SQL处理表和一些数据:


有什么想法吗?

使用一个只包含最新登录详细信息的视图,并使用下面的查询,怎么样

select l.user_id, l.date, l.isright from logins l
where l.date >= (select max(l2.date) from logins l2
    where l2.isright=1 and l2.user_id = l.user_id)

直接的方法是有两个派生表:一个用于获取每个用户的上次登录日期,另一个用于获取每个用户的上次成功登录日期。然后从用户中选择,连接两个派生表,查看上次登录是否成功,并统计上次成功登录后的(失败)登录数。(对于另一个DBMS,您更愿意使用MySQL所缺乏的分析功能。)

这为每个用户提供了四种可能性:

  • 用户从未尝试登录。上次登录成功为空,上次登录失败无意义
  • 用户的登录全部失败。上次登录成功为0,上次登录失败无意义
  • 用户上次登录成功。last_login_successful为1,last_login_failed为无意义
  • 用户成功登录了一次,但至少在最后一次尝试时失败。last_login_successful为0,last_logins_failed为上次成功登录后的失败次数
  • 这是一把小提琴:

    编辑:当用户从未登录时,也统计失败的登录次数:如果用户从未登录,则其上次登录日期为空。在last_logins_failed(上次登录失败)中,您希望统计上次登录之前发生或从未发生的所有记录:


    我想你可以做类似的事情

    select count(*)
    from logins as l join users as u on l.user_id = u.id
    where l.timestamp > (select max(timestamp)
                         from logins
                         where user_id = u.id and isright = 1)
    
    获取用户成功登录的最后一个时间戳(子查询)
    然后获取时间戳大于用户时间戳的所有登录的计数,这会自动为您只提供不成功的登录,因为您将最后一次成功登录作为参考时间戳/日期时间

    您是否尝试使用子查询获取最后一次成功登录的日期/时间,然后只计算日期在该日期/时间之后的日期/时间?如果您能给我两个表的描述,我可能会提供更多帮助,考虑提供适当的DDL(和/或SQLFIDLE)以及所需的结果。@JeremyC.-下面是一些示例数据:这个答案绝对值得更多的投票!非常感谢你!我不太熟悉这种sql语法,你能给我一个提示,即使用户从未正确登录,如何计算错误登录数吗?(第2点)我已相应地编辑了我的答案。请注意,我用
    where user\u id=students.id
    替换了
    where user\u id=students.id
    ,因为在外部连接情况下,上次成功登录的用户id将为null。
      (
        select count(*)
        from logins
        where user_id = students.id and (date > last_successful_login.date
        or last_successful_login.date is null)
      ) as last_logins_failed
    
    select count(*)
    from logins as l join users as u on l.user_id = u.id
    where l.timestamp > (select max(timestamp)
                         from logins
                         where user_id = u.id and isright = 1)