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所缺乏的分析功能。) 这为每个用户提供了四种可能性:
我想你可以做类似的事情
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)