You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL生成八卦网络中所有直接与间接关联的关系表?

解决方案:用递归CTE识别八卦传播圈子并生成全关联表

要处理任意长度的传播链、生成所有直接/间接关联的gossip_from和gossip_to配对,同时筛选出人数超4的圈子,递归CTE(公共表表达式)是最适合的方案。以下是具体实现步骤和代码:

核心思路

把所有gossip_from和gossip_to看作无向图的节点,通过递归遍历找出所有连通的节点(即同一个八卦圈子),再将圈子内的所有from和to做笛卡尔积,得到全关联配对,最后筛选出符合人数要求的圈子。

完整SQL代码

WITH recursive graph AS (
    -- 构建无向图:包含原始正向边和反向边
    SELECT gossip_from AS node1, gossip_to AS node2 FROM gossip_pairs
    UNION
    SELECT gossip_to AS node1, gossip_from AS node2 FROM gossip_pairs
),
connected_components AS (
    -- 锚点:每个节点初始以自身为根节点
    SELECT node1 AS node, node1 AS root FROM graph
    UNION ALL
    -- 递归遍历:合并所有连通节点到同一根节点下
    SELECT g.node2, cc.root
    FROM connected_components cc
    JOIN graph g ON cc.node = g.node1
    WHERE g.node2 NOT IN (SELECT node FROM connected_components WHERE root = cc.root)
),
unique_components AS (
    -- 去重每个节点的根节点记录
    SELECT DISTINCT node, root FROM connected_components
),
component_froms AS (
    -- 收集每个连通分量下的所有gossip_from节点
    SELECT uc.root, gp.gossip_from
    FROM unique_components uc
    JOIN gossip_pairs gp ON uc.node = gp.gossip_from
    GROUP BY uc.root, gp.gossip_from
),
component_tos AS (
    -- 收集每个连通分量下的所有gossip_to节点
    SELECT uc.root, gp.gossip_to
    FROM unique_components uc
    JOIN gossip_pairs gp ON uc.node = gp.gossip_to
    GROUP BY uc.root, gp.gossip_to
)
-- 生成所有直接/间接关联的from-to配对,并筛选人数超4的圈子
SELECT cf.gossip_from, ct.gossip_to
FROM component_froms cf
JOIN component_tos ct ON cf.root = ct.root
-- 筛选条件:圈子内gossip_from人数超过4
WHERE cf.root IN (
    SELECT root FROM component_froms 
    GROUP BY root 
    HAVING COUNT(DISTINCT gossip_from) > 4
)
ORDER BY cf.gossip_from, ct.gossip_to;

代码解释

  1. graph CTE:将原始的单向传播关系转换成无向边,确保能遍历到所有间接关联的节点(比如A→B和B→A都被视为连通)。
  2. connected_components 递归CTE:给每个节点分配一个根节点,同一个八卦圈子的所有节点会共享同一个根,完成连通分量的识别。
  3. unique_components:去重节点与根的映射关系,避免重复计算。
  4. component_froms 和 component_tos:分别提取每个圈子里的所有传播者(gossip_from)和接收者(gossip_to)。
  5. 最终查询:将同一圈子的传播者和接收者做笛卡尔积,得到所有直接/间接关联的配对,同时通过子查询筛选出传播者人数超过4的圈子。

与常规连接的区别

你之前尝试的多表连接只能处理固定长度的传播链(比如最多2跳),而递归CTE可以自动遍历任意长度的传播链,完全覆盖所有间接关联关系,适合处理大规模、长链条的数据集。

内容的提问来源于stack exchange,提问作者jjbell123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:12:04