我有一个应用程序需要查询MySQL数据库并检索可能正在共享IP地址的用户列表,而我在使用我的头脑中的查询转换我想要做的概念时遇到了一些麻烦进入功能查询。
情况是我有一个包含用户已知ip信息的表。每次用户登录时,它都会创建一个带时间戳的条目,其中包含用户ID和登录的IP地址。
最初,我使用以下查询返回表示共享的IP地址的行:
select ip, GROUP_CONCAT(DISTINCT account ORDER BY timestamp SEPARATOR ' ')
from known_ips
group by ip having count(1) > 1
但是,许多用户拥有动态IP地址,因此该列表包含许多重复条目(显然,每个IP地址与其他用户共享一个)。
我想要做的是让每行返回的是一组唯一的用户,他们在任何时候都可以相互共享任何IP地址。
例如,如果Bob和Jane共享IP地址192.168.0.1并且Bob和Fred共享IP地址192.168.0.2,我希望该行返回'Bob Fred Jane'(该程序正在取得此结果查询并对其进行一些操作,基本上需要一个帐户列表来采取行动。)
我自己无法弄清楚的是如何进行这种聚合(或者甚至是否可能)。我最初尝试将原始查询作为CTE(使用with子句),然后尝试对其进行分组,但是我遇到了一个绊脚石,我无法弄清楚如何逻辑地执行操作“比较字符串分隔的列表组1中的用户看看是否存在组2“,我认为进行那种字符串比较并不是SQL的全部意义(我可以在程序中而不是SQL中进行)。
有没有人知道任何技术,我可以代表我在MySQL中尝试实现的逻辑?或者,我应该接受我已经达到的解决方案,然后在客户端应用程序中进行聚合吗?
修改
响应对数据和输出样本的请求,这是一个人为的数据示例:
Account IP Timestamp
Bob 192.168.0.1 2014-02-12 08:00
Bob 192.168.0.1 2014-02-12 09:30
Bob 192.168.0.2 2014-02-12 10:00
Mary 192.168.0.1 2014-03-12 07:00
Bob 192.168.0.2 2014-03-12 08:00
Jim 192.168.0.4 2014-03-12 08:30
Ted 192.168.0.2 2014-03-12 09:00
Jim 192.168.0.5 2014-04-12 08:30
Bob 192.168.0.3 2014-04-12 09:30
Andy 192.168.0.6 2014-04-12 10:30
Paul 192.168.0.6 2014-04-12 11:30
从这个示例数据中,我预计会返回两行:
Bob Mary Ted
Andy Paul
尽管我之前使用过ORDER BY时间戳,但我对列表中的帐户排序感到矛盾。