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
英文版 https://c.scudata.com/article/1732007780839