我有一个MySQL表,其中包含有关用户的多对多数据:
username (PK) ip (PK) machine_id (PK)
--------------------------------------------------
tester1 1.2.3.4 ABC
tester1 6.6.6.6 BBB
tester2 1.2.3.4 ZZZ
tester3 2.3.4.5 ABC
tester4 2.3.4.5 OOO
tester5 1.2.3.4 XYZ
tester5 8.9.7.6 BBB
tester5 1.2.3.4 OOO
tester6 9.9.9.9 ZZZ
它使用组合主键将行限制为所有三列的唯一组合。
如您所见,同一用户可以使用多个IP地址和多台计算机的组合来访问系统。就我的目的而言,如果他们拥有相同的IP或机器ID,则它们是同一个用户。
我想找到一种方法来查找数据之间的所有可能连接,以便我可以识别某人使用的用户名/ IP / ID的每种可能组合。
示例
如果我想知道 tester1 使用了什么别名,那么很简单:SELECT * FROM users WHERE username LIKE '%tester1%'
会给我:
tester1 1.2.3.4 ABC
tester1 6.6.6.6 BBB
然后,我可以将IP 1.2.3.4和6.6.6.6与此用户连接,如果我查找这两个IP,我可以看到他们使用了一些其他名称和机器ID:
tester2 1.2.3.4 ZZZ
tester5 1.2.3.4 XYZ
tester5 1.2.3.4 OOO
tester1 6.6.6.6 BBB
然后我继续查找用户的所有计算机ID,这为我们提供了另外一个别名(来自计算机ID OOO
):
tester4 2.3.4.5 OOO
查找OOO
我发现另一个IP,2.3.4.5,这给了我另一个连接:
tester3 2.3.4.5 ABC
由于我们之前已经查找过计算机ID ABC
,因此无需再次查找。
我现在已经确定了该用户的所有可能别名,并且拥有他所使用的IP,机器ID和用户名的完整列表。所有这些都来自递归查找数据,其结果然后在其上执行另一个递归查找,依此类推。
我的问题是,如何将此逻辑转换为PHP / SQL?
有没有办法通过查询直接提取所有“连接”数据,或者是否需要进行一些PHP处理,如果是,那又是什么?
答案 0 :(得分:0)
基本上,您可以在计算机ID列上使用select查询和2个自联接。例如:
select * from users left join users u1 on users. mid=u1.mid left join users u2 on u1. mid=u2. mid where name like "%tester1%"