
本文详解如何通过嵌套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安全规范。在设计用户增长看板或分销奖励系统时,该模式是构建层级关系统计的基础范式。










