Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询以选择自上次成功以来的所有行_Mysql_Group By - Fatal编程技术网

Mysql 查询以选择自上次成功以来的所有行

Mysql 查询以选择自上次成功以来的所有行,mysql,group-by,Mysql,Group By,鉴于我的下表结构: 我正在尝试构建一个查询,该查询将返回自上一次在过去一小时内成功登录同一IP以来每个IP的失败登录尝试次数 例如,您会注意到,在过去的一个小时内,有几次失败的尝试0来自单个IP,但自从上次成功登录145以来,只有1146次,这就是我想要返回的 此查询也应该是动态的,并返回分组IP的行 到目前为止,这就是我所拥有的,但我认为@ipa返回空值 感谢为该表添加别名,并以这种方式尝试,因为@ipa变量对您没有任何帮助: SELECT COUNT(1) tries, l.login_ip

鉴于我的下表结构:

我正在尝试构建一个查询,该查询将返回自上一次在过去一小时内成功登录同一IP以来每个IP的失败登录尝试次数

例如,您会注意到,在过去的一个小时内,有几次失败的尝试0来自单个IP,但自从上次成功登录145以来,只有1146次,这就是我想要返回的

此查询也应该是动态的,并返回分组IP的行

到目前为止,这就是我所拥有的,但我认为@ipa返回空值


感谢

为该表添加别名,并以这种方式尝试,因为@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