Mysql 如何将互连的ID对列表转换为ID集群?

Mysql 如何将互连的ID对列表转换为ID集群?,mysql,node.js,data-science,Mysql,Node.js,Data Science,我有一个带有成对(有时是三个)ID的表,这些ID充当链中的某种链接 +------+-----+ | from | to | +------+-----+ | id1 | id2 | | id2 | id3 | | id4 | id5 | +------+-----+ 我想创建一个新表,其中所有链接都聚集到链/族中: +-----+----------+ | id | familyid | +-----+----------+ | id1 | 1 | | id2 |

我有一个带有成对(有时是三个)ID的表,这些ID充当链中的某种链接

+------+-----+
| from | to  |
+------+-----+
| id1  | id2 |
| id2  | id3 |
| id4  | id5 |
+------+-----+
我想创建一个新表,其中所有链接都聚集到链/族中:

+-----+----------+
| id  | familyid |
+-----+----------+
| id1 |        1 |
| id2 |        1 |
| id3 |        1 |
| id4 |        2 |
| id5 |        2 |
+-----+----------+
i、 e.将链接中的所有链添加到单个族中,并给它一个id。 在上面的示例中,第一个表的前两行创建一个族,最后一行创建另一个族

解决方案

我将使用node.js查询大批量的行(每批几千行),处理它们,并将它们插入到我自己的带有族id的表中

问题

问题是我有几万个id对,在最初创建families表之后,我还需要随着时间的推移添加新id,并且我需要将id添加到现有的族中


记住我的问题,有没有好的算法可以将成对的数据聚类到族/簇中?

不确定这是否是一个答案,因为更多的想法。。。 我创建了两个与您所拥有的表类似的表,第一个表使用与您相同的数据填充

Table Base, fromID, toID
Table chain, fromID, chainID (numeric, null allowed)
然后,我使用chainID的空值将Base中的所有唯一值插入到chain中。想法是这些是尚未处理的行

那是一个反复运行几个语句的案例

update chain c 
  set chainID = n 
  where chainid is null and exists ( select 1 from base b where b.fromID = c.fromID )
  order by fromID 
  limit 1
这将把下一个链ID分配给没有链ID的第一行(n需要从某处生成,并在每次运行时递增)

然后是关于所有记录的那个

update chain c 
    join base b on b.toID = c.fromID
    join chain c1 on b.fromID = c1.fromID
    set c.chainID = c1.chainID 
    where c.chainID is null and c1.chainID is not null
这将重复运行,直到影响0行为止(即,无需执行更多操作)。 然后运行第一次更新以创建下一个链等。如果运行第一次更新直到影响0行,这表明它们都已链接


如果您想尝试此功能,并查看它是否适用于更复杂的场景,您可能会感兴趣。

这看起来很像graph dataset上的群集,其中“familyid”是群集中心编号


您将需要在您描述的条件下实现。

这通常可能需要一个递归的分层查询,MySQL不擅长这种查询,然后再进行一些操作以获得家庭编号。有可能,但需要一点工作。你试过了吗?在过去的几个月里,我做了一些非常类似的事情,但是当我做这件事时,我没有计划,只是开始使用大型json数组,合并、映射、缩减,并做了一大堆所谓的“奥运会”,最后得到了一个解决方案。只是现在我不知道如何回过头来再做一次。这就是为什么我现在在这里,试图找出是否有一些更“官方”的东西可以帮助我在不使用电子表格的情况下做到这一点。好吧……家谱有固定的深度吗?如果不是,那么您几乎肯定需要动态SQL来实现这一点;这超出了我的工资等级。我不打算用一个sql查询来完成这项工作,我想从第一个表中查询成批数据,进行一些node.js处理,然后将其插入新表,可能有多个语句。不,我可能会尝试在数据库中完全处理这项工作,除非有迫切的理由不这样做。层次有多深?