如何统计“我的邀请者所发展的下级邀请总数”(间接邀请数)

2次阅读

如何统计“我的邀请者所发展的下级邀请总数”(间接邀请数)

本文详解如何通过嵌套sql查询统计用户直接邀请的用户所发展的全部下级邀请数量,即间接邀请总数,并提供安全、可复用的pdo实现方案。

本文详解如何通过嵌套sql查询统计用户直接邀请的用户所发展的全部下级邀请数量,即间接邀请总数,并提供安全、可复用的pdo实现方案。

在用户关系链路中,常需区分两类邀请数据:直接邀请数(你本人邀请的用户数)与间接邀请数(你邀请的用户 再次 邀请的用户总数)。前者对应 ref_user_id = 当前用户ID 的记录数;后者则需两层关联——先找出你的所有直接被邀者(即 user_id 字段中、且 ref_user_id 为你ID的记录),再统计这些被邀者作为邀请人(即 ref_user_id)所产生的新邀请。

核心思路是使用子查询定位“你的邀请人名单”,再在外层统计他们各自的邀请行为。对应的SQL如下:

select COUNT(id) AS indirect_referrals  FROM referrals  WHERE ref_user_id IN (     SELECT user_id      FROM referrals      WHERE ref_user_id = :user_id );

执行逻辑说明

  • 内层查询 SELECT user_id FROM referrals WHERE ref_user_id = :user_id 返回所有由当前用户直接邀请的 user_id 列表(即你的“一级下线”);
  • 外层查询统计 referrals 表中 ref_user_id 属于该列表的所有记录数,即这些一级下线各自发展的“二级下线”总和。

以下是完整的、生产就绪的PHP + PDO实现(含错误处理与参数绑定):

try {     // 查询间接邀请总数     $sql = "SELECT COUNT(id) AS indirect_referrals              FROM referrals              WHERE ref_user_id IN (                 SELECT user_id                  FROM referrals                  WHERE ref_user_id = :user_id             )";      $stmt = $link->prepare($sql);     $stmt->bindValue(':user_id', $_SESSION['id'], PDO::PARAM_int);     $stmt->execute();      $row = $stmt->fetch(PDO::FETCH_ASSOC);     $indirectReferrals = (int)($row['indirect_referrals'] ?? 0);      // 可选:同时获取直接邀请数(复用原逻辑)     $directSql = "SELECT COUNT(id) AS direct_referrals FROM referrals WHERE ref_user_id = :ref_user_id";     $directStmt = $link->prepare($directSql);     $directStmt->bindValue(':ref_user_id', $_SESSION['id'], PDO::PARAM_INT);     $directStmt->execute();     $directRow = $directStmt->fetch(PDO::FETCH_ASSOC);     $directReferrals = (int)($directRow['direct_referrals'] ?? 0);      echo "直接邀请:{$directReferrals} 人 | 间接邀请:{$indirectReferrals} 人"; } catch (PDOException $e) {     error_log("Referral count query failed: " . $e->getMessage());     throw new RuntimeException("无法加载邀请统计数据,请稍后重试。"); }

⚠️ 关键注意事项

  • 索引优化:为保障查询性能,建议在 referrals(ref_user_id) 和 referrals(user_id) 字段上分别建立B-tree索引;若表数据量大(>10万行),可考虑复合索引 INDEX idx_ref_user (ref_user_id, user_id);
  • 空结果安全:使用 (int)($row[‘indirect_referrals’] ?? 0) 避免 NULL 导致的类型异常;
  • 防SQL注入:始终使用 bindValue() 绑定参数,严禁字符串拼接;
  • 逻辑边界:此方案仅统计二级邀请(即“你的邀请者所邀请的人”),不递归统计三级及更深层级;如需多级累计(如全路径邀请树),应改用递归CTE或应用层迭代实现。

总结而言,借助一次嵌套子查询即可高效获取间接邀请总数,代码简洁、语义清晰,且完全兼容标准SQL与PDO安全规范。在设计用户增长看板或分销奖励系统时,该模式是构建层级关系统计的基础范式。

text=ZqhQzanResources