可以的,自连接(self join)完全可以用于统计,而且在很多业务场景下是非常常见、也非常有效的做法。
自连接就是一张表自己和自己连接,通常借助表别名区分“左表”和“右表”。
SELECT a.id, b.id
FROM employee a
JOIN employee b
ON a.manager_id = b.id;
例如:统计每个经理手下有多少员工
SELECT
m.name AS manager,
COUNT(e.id) AS emp_count
FROM employee e
JOIN employee m
ON e.manager_id = m.id
GROUP BY m.name;
✅ 这是最典型的“自连接 + 聚合统计”
例如:统计每天相比前一天的销售额变化
SELECT
a.date,
a.sales,
b.sales AS prev_sales,
a.sales - b.sales AS diff
FROM sales a
JOIN sales b
ON a.date = DATE_ADD(b.date, INTERVAL 1 DAY);
可用于:
例如:统计同一用户连续两次登录的间隔
SELECT
a.user_id,
a.login_time,
b.login_time AS next_login,
TIMESTAMPDIFF(MINUTE, a.login_time, b.login_time) AS gap
FROM login_log a
JOIN login_log b
ON a.user_id = b.user_id
AND b.login_time > a.login_time;
例如:找重复邮箱
SELECT a.email
FROM user a
JOIN user b
ON a.email = b.email
AND a.id < b.id;
很多“前后行”统计,用窗口函数更优雅:
LAG(sales) OVER (ORDER BY date)
✅ 新版本数据库(MySQL 8+、PostgreSQL、Oracle)优先用窗口函数
✅ 老版本或复杂层级关系才用自连接
自连接不仅能用于统计,而且在层级、对比、配对类统计中非常强大。
如果你有具体的业务场景(比如订单、用户、组织架构),我可以直接帮你写 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。