Mysql 查询以选择自上次成功以来的所有行
鉴于我的下表结构: 我正在尝试构建一个查询,该查询将返回自上一次在过去一小时内成功登录同一IP以来每个IP的失败登录尝试次数 例如,您会注意到,在过去的一个小时内,有几次失败的尝试0来自单个IP,但自从上次成功登录145以来,只有1146次,这就是我想要返回的 此查询也应该是动态的,并返回分组IP的行 到目前为止,这就是我所拥有的,但我认为@ipa返回空值Mysql 查询以选择自上次成功以来的所有行,mysql,group-by,Mysql,Group By,鉴于我的下表结构: 我正在尝试构建一个查询,该查询将返回自上一次在过去一小时内成功登录同一IP以来每个IP的失败登录尝试次数 例如,您会注意到,在过去的一个小时内,有几次失败的尝试0来自单个IP,但自从上次成功登录145以来,只有1146次,这就是我想要返回的 此查询也应该是动态的,并返回分组IP的行 到目前为止,这就是我所拥有的,但我认为@ipa返回空值 感谢为该表添加别名,并以这种方式尝试,因为@ipa变量对您没有任何帮助: SELECT COUNT(1) tries, l.login_ip
感谢为该表添加别名,并以这种方式尝试,因为@ipa变量对您没有任何帮助:
SELECT COUNT(1) tries, l.login_ip
FROM login_log l
WHERE login_id > (
SELECT MAX(login_id)
FROM login_log l2
WHERE l2.login_success = 1
AND l2.login_ip = l.login_ip
)
AND login_success = 0
AND login_date > NOW() - 3600
GROUP BY login_ip
ORDER BY tries DESC;
此外,您还可以通过连接执行此操作:
您可以尝试两种方法,看看哪种方法对您来说更快。在使用@ipa之前,您似乎没有设置它。第二种方法的第8行末尾缺少一个逗号,但其他方法都可以!而且速度更快,因为我不必做子查询。谢谢@史蒂文瑟-啊,很抱歉丢失了逗号。修正:为了澄清,您正在执行子查询,而不是相关子查询。不同之处在于前者只运行一次,而后者每行运行一次,这可能需要一点时间。如果IP从未成功登录,我该如何使其工作?它只是没有为它返回一行,但它应该返回。将inner改为left,然后将and log1.login_date>log2.max_date改为and log1.login_date>coalesselog2.max_date,'1900-01-01'
SELECT COUNT(1) tries, l.login_ip
FROM login_log l
WHERE login_id > (
SELECT MAX(login_id)
FROM login_log l2
WHERE l2.login_success = 1
AND l2.login_ip = l.login_ip
)
AND login_success = 0
AND login_date > NOW() - 3600
GROUP BY login_ip
ORDER BY tries DESC;
select
count(1) tries,
log1.login_ip
from
login_log log1
inner join (
select
login_ip,
max(login_date) as max_date
from
login_log
where
login_success = 1
group by
login_ip
) log2 on
log1.login_ip = log2.login_ip
where
log1.login_success = 0
and log1.login_date > NOW() - 3600
and log1.login_date > log2.max_date
group by
login_ip
order by tries desc