这种递归多对多数据库查找的最优雅方法是什么?

时间:2013-07-30 18:38:41

标签: php mysql oop recursion recursive-query

我有一个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处理,如果是,那又是什么?

1 个答案:

答案 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%"