Mysql 在SQL中聚合多个组
我有一个应用程序,需要查询MySQL数据库并检索可能共享IP地址的用户列表,我在将我头脑中的查询概念转变为功能查询时遇到了一些困难 情况是,我有一个表,其中包含用户的已知ip信息。每次用户登录时,它都会创建一个带有时间戳的条目,其中包含用户id和登录的ip地址 最初,我使用以下查询返回表示共享IP地址的行:Mysql 在SQL中聚合多个组,mysql,grouping,Mysql,Grouping,我有一个应用程序,需要查询MySQL数据库并检索可能共享IP地址的用户列表,我在将我头脑中的查询概念转变为功能查询时遇到了一些困难 情况是,我有一个表,其中包含用户的已知ip信息。每次用户登录时,它都会创建一个带有时间戳的条目,其中包含用户id和登录的ip地址 最初,我使用以下查询返回表示共享IP地址的行: select ip, GROUP_CONCAT(DISTINCT account ORDER BY timestamp SEPARATOR ' ') from known_ips group
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
尽管我之前使用了按时间戳排序,但我对列表中帐户的排序感到矛盾。请通过SQL fiddle共享示例数据以及您希望结果集是什么样子。(你知道MySQL没有CTE的权利吗?)。至少这解释了为什么我的CTE方法不起作用!如果bob从3个不相关的IP(工作/家庭/移动)登录怎么办?其他不相关的用户是否应该仅仅因为在某个时候共享IP而与bob加入一个组?MySQL没有内置的图形遍历算法支持,这正是您所需要的。其他数据库支持递归CTE和
connect
语句等构造。您需要在存储过程中使用while
循环来完成此操作。谢谢Gordon,作为一个没有接受过算法理论正式培训的人,知道我试图找到的技术或解决方案的名称非常有帮助。我将研究图遍历算法。