Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL中聚合多个组_Mysql_Grouping - Fatal编程技术网

Mysql 在SQL中聚合多个组

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

我有一个应用程序,需要查询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

尽管我之前使用了按时间戳排序,但我对列表中帐户的排序感到矛盾。

请通过SQL fiddle共享示例数据以及您希望结果集是什么样子。(你知道MySQL没有CTE的权利吗?)。至少这解释了为什么我的CTE方法不起作用!如果bob从3个不相关的IP(工作/家庭/移动)登录怎么办?其他不相关的用户是否应该仅仅因为在某个时候共享IP而与bob加入一个组?MySQL没有内置的图形遍历算法支持,这正是您所需要的。其他数据库支持递归CTE和
connect
语句等构造。您需要在存储过程中使用
while
循环来完成此操作。谢谢Gordon,作为一个没有接受过算法理论正式培训的人,知道我试图找到的技术或解决方案的名称非常有帮助。我将研究图遍历算法。