2

我有一个 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 处理,如果需要,怎么办?

4

1 回答 1

0

基本上,您可以在机器 id 列上使用选择查询和 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%"
于 2013-07-30T19:27:11.977 回答