如何查询e_employer表中仅关联1个e_user用户的雇主数据
可行实现方案
方案1:分组统计后关联查询(性能最优,适配绝大多数场景)
核心逻辑是先统计每个雇主关联的用户数量,筛选出仅关联1个用户的雇主ID,再关联雇主表获取完整信息:
SELECT emp.* FROM e_employer emp INNER JOIN ( -- 统计所有仅关联1个用户的雇主ID SELECT employer_id FROM e_user GROUP BY employer_id HAVING COUNT(user_id) = 1 ) user_filter ON emp.employer_id = user_filter.employer_id;
如果需要同时返回该雇主关联的唯一用户信息,可调整查询字段:
SELECT emp.employer_id, emp.employername, u.user_id, u.username FROM e_employer emp INNER JOIN e_user u ON emp.employer_id = u.employer_id INNER JOIN ( SELECT employer_id FROM e_user GROUP BY employer_id HAVING COUNT(user_id) = 1 ) user_filter ON emp.employer_id = user_filter.employer_id;
方案2:窗口函数实现(适合需要保留明细的场景)
如果后续需要扩展统计逻辑,可使用窗口函数实现,代码更简洁:
SELECT employer_id, employername, user_id, username FROM ( SELECT emp.employer_id, emp.employername, u.user_id, u.username, -- 按雇主分组统计关联用户数 COUNT(u.user_id) OVER(PARTITION BY emp.employer_id) AS user_count FROM e_employer emp INNER JOIN e_user u ON emp.employer_id = u.employer_id ) temp WHERE temp.user_count = 1;
补充说明
- 以上两种方案默认仅返回有且仅有1个关联用户的雇主,若需要包含无关联用户的雇主,将
INNER JOIN改为LEFT JOIN,同时调整筛选条件为user_count = 0 OR user_count = 1即可 - 统计用户数时建议使用
COUNT(user_id)而非COUNT(*),避免e_user表中employer_id为空的脏数据干扰统计结果
内容的提问来源于stack exchange,提问作者Rikhi Sahu
相关产品推荐
相关产品推荐

