
本文介绍如何通过单条sql查询实现“直接邀请数”与“间接邀请数”的分层统计,重点解析嵌套子查询在多级推荐关系中的应用,并提供安全、可扩展的php实现方案。
本文介绍如何通过单条sql查询实现“直接邀请数”与“间接邀请数”的分层统计,重点解析嵌套子查询在多级推荐关系中的应用,并提供安全、可扩展的php实现方案。
在用户邀请系统(如分销、裂变营销)中,常需区分两类邀请量:
- 直接邀请数:当前用户作为推荐人(ref_user_id)所邀请的用户总数;
- 间接邀请数:由当前用户的直接被邀请者(即 user_id)进一步邀请的用户总数——即“邀请者的邀请者”所产生的下级邀请。
根据提供的表结构(referrals(id, user_id, ref_user_id)),其中:
- user_id 表示被邀请用户的唯一ID;
- ref_user_id 表示邀请人(推荐人)的ID;
因此,若当前用户 ID 为 :user_id,则:
✅ 其直接邀请者 = 所有 ref_user_id = :user_id 的记录;
✅ 这些人的 user_id 值,正是其下一级邀请人的身份标识;
✅ 这些 user_id 作为新的 ref_user_id,即可查出他们各自邀请的用户——即间接邀请。
✅ 正确的间接邀请统计SQL
使用子查询获取所有“我的直接被邀请者”,再以其 user_id 为条件筛选第二层邀请:
SELECT COUNT(id) AS indirect_referrals
FROM referrals
WHERE ref_user_id IN (
SELECT user_id
FROM referrals
WHERE ref_user_id = :user_id
);该语句逻辑清晰、无需JOIN,且兼容MySQL 5.7+及MariaDB等主流版本。
? 安全的PHP实现(PDO预处理)
以下代码同时获取直接邀请数与间接邀请数,避免两次独立查询,提升可维护性:
<?php
try {
// 合并查询:一次性获取 direct + indirect
$sql = "
SELECT
(SELECT COUNT(*) FROM referrals WHERE ref_user_id = :user_id) AS direct_referrals,
(SELECT COUNT(*) FROM referrals WHERE ref_user_id IN (
SELECT user_id FROM referrals WHERE ref_user_id = :user_id
)) AS indirect_referrals
";
$stmt = $link->prepare($sql);
$stmt->bindValue(':user_id', $_SESSION['id'], PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$direct = (int)$result['direct_referrals'];
$indirect = (int)$result['indirect_referrals'];
$total = $direct + $indirect;
echo "直接邀请:{$direct} 人<br>";
echo "间接邀请:{$indirect} 人<br>";
echo "邀请总量:{$total} 人";
} catch (PDOException $e) {
error_log("Referral count query failed: " . $e->getMessage());
echo "数据加载异常,请稍后重试。";
}
?>⚠️ 注意事项与优化建议
- 索引至关重要:确保 referrals(ref_user_id) 和 referrals(user_id) 字段均建有B-tree索引,否则子查询性能将随数据增长急剧下降;
- 层级限制:当前方案仅支持一级间接邀请(即“我的邀请者所邀请的人”)。如需统计二级、三级(如“我的邀请者的邀请者的邀请者”),应改用递归CTE(MySQL 8.0+)或应用层迭代,避免深度嵌套子查询导致性能崩溃;
- 空结果安全:COUNT(*) 在无匹配时返回 0,无需额外 COALESCE,但需注意 NULL 值字段(本例中 id 为主键,无NULL风险);
- 权限与会话校验:生产环境务必校验 $_SESSION['id'] 是否有效、是否已登录,防止ID伪造;
- 扩展性提示:若业务后续需支持邀请关系图谱、佣金穿透计算等,建议引入闭包表(Closure Table)或路径枚举(Path Enumeration)模型,而非依赖动态子查询。
掌握这种“自关联+子查询”的思维模式,是构建多级推荐、组织架构、权限继承等树形关系系统的通用基础。从一个IN (SELECT ...)出发,你已迈出了分层数据建模的关键一步。










