Php MySQL统计时间段内共享至少3列中的1列的条目数

Php MySQL统计时间段内共享至少3列中的1列的条目数,php,mysql,sql,email,Php,Mysql,Sql,Email,我有一个记录无效用户登录尝试的表。每次尝试无效时,用户名、用户IP、用户电子邮件和时间/日期都存储在数据库中 我想做的是检查在任何24小时内,是否有超过X次的无效尝试由同一个用户。但是,用户可以随时更改电子邮件、用户名或IP。所以,我需要检查这三个字段中的任何一个是否相同 例如: 用户ID:1;IP:1.1.1.1;电邮:test@test.com 用户ID:2;IP:1.1.1.1;电邮:test2@test.com 用户ID:1;IP:1.1.1.2;电邮:test3@test.com

我有一个记录无效用户登录尝试的表。每次尝试无效时,用户名、用户IP、用户电子邮件和时间/日期都存储在数据库中

我想做的是检查在任何24小时内,是否有超过X次的无效尝试由同一个用户。但是,用户可以随时更改电子邮件、用户名或IP。所以,我需要检查这三个字段中的任何一个是否相同

例如:

用户ID:1;IP:1.1.1.1;电邮:test@test.com 用户ID:2;IP:1.1.1.1;电邮:test2@test.com 用户ID:1;IP:1.1.1.2;电邮:test3@test.com 用户ID:4;IP:1.1.1.4;电邮:test@test.com 用户ID:5;IP:1.1.1.4;电邮:test5@test.com
所有这些都将作为同一个用户匹配,因为它们共享用户ID、IP或电子邮件。然后我需要输出所有用户ID、IP和电子邮件,这样我就可以禁止另一个表中符合这些条件的任何用户

这条评论太长了

您拥有的是记录之间的连接图,其中边是电子邮件、用户名和IP。您需要遍历此图以查找连接的子图。这很难。例如,在您的示例中,id2和id2是连接的,但它们没有共同的字段

所以,您需要一个图遍历算法。MySQL没有直接在SQL中支持这种算法的结构。您可以编写一个存储过程来查找这样的组,但这不是一条SQL语句所能做到的

编辑:

当我以前遇到这个问题时,我使用SQL,并重复使用update语句。其思想是为每个记录分配遇到的最低用户ID

create table tgroup as
    select t.*, id as grpid
    from table t;

update tgroup join
       (select email, min(id) as minid
        from tgroup t
        group by email
       ) tt
       on tt.email = tgroup.email and
          tt.minid < tgroup.id
    set tgroup.id = least(tt.minid, tgroup.id);

update tgroup join
       (select ip, min(id) as minid
        from tgroup t
        group by ip
       ) tt
       on tt.ip = tgroup.ip and
          tt.minid < tgroup.id
    set tgroup.id = least(tt.minid, tgroup.id);

然后,您必须重复此操作,直到没有任何更新。

谢谢,这是有道理的。您对PHP中的这种算法有什么建议吗?我在考虑使用数组,但我不能完全理解。如果1.1.1与显示的所有ID一致,您可以根据IP地址的前3组数字来确定自己。这似乎是与你发布的所有内容唯一密切相关的。谢谢。知识产权只是一个例子,在现实中,它们将是真实的,而且变化很大。这些用户仍然以某种方式连接,因为每个人彼此共享一个ID、IP或电子邮件。甚至id2和id5都是相关的,因为虽然它们不共享直接字段,但它们通过id4等具有二阶关系。啊,我明白了。是的,我知道戈登的回答解释了解决问题的复杂性。这是一个头部撞击。