SQL:找出无共同关联点的关联成员组

PostgreSQL 数据库用一张表记录两个 id 之间的直接关系,比如 [1,3]、[3,6]。除了直接关系,两个点也可以通过共同的关联点形成一层的间接关联,比如[3,5] 的共同关联点是 1。还可能有多层的间接关联,那就不是共同的关联点,而是关联链。

user_id1

user_id2

1

3

1

5

2

4

2

5

3

5

4

5

6

7

8

9

3

6

请找出直接关联,但没有共同关联点的 id,即 [6,7]、[8,9]、[3,6]。

编写SPL代码



1

=PostgreSQL.query("select * from tb")

2

=direct=A2.array@b()

3

=undir=direct.conj(~[1:].(direct.~ % ~).select(~.len()==2))

4

=direct.(~.sort())\undir.(~.sort())

A1:通过JDBC查询数据库。

A2:将每条记录的字段拼成一个小集合,记录再拼成大集合,也就是有直接关联的id的集合。

A3:找出有共同关联点的id的集合。~[1:]表示取当前成员的下一个成员直到最后一个成员。direct.~ % ~用当前成员和之后的每个成员做异或运算,如果有共同关联点,则结果为 2 个 id,如果没有共同关联点,则会有 4 个 id。再用 select 函数过滤出有 2 个 id 的小集合。conj 函数用来合并这些小集合。

A4:计算两个大集合的差集。注意,顺序不同的点组成的两个集合成员是不同的,因此要用同样的规则对小集合内部进行排序。

问题来源:https://stackoverflow.com/questions/78393715/find-users-pairs-who-have-no-mutual-friends