统计各用户会话数的SQL子查询对应的JOIN等价写法是什么
相关子查询的JOIN等价实现
你当前使用的相关子查询会保留user表中的全部用户记录,即使用户没有任何关联的请求记录,也会返回该用户的会话数为0,要完全对齐这个逻辑,需要使用左连接搭配分组聚合实现,具体SQL如下:
SELECT user.id, COUNT(DISTINCT request.session_id) AS session_count FROM user LEFT JOIN request ON request.user_id = user.id GROUP BY user.id;
写法注意点
- 不能用
INNER JOIN替换LEFT JOIN:内连接会直接过滤掉没有任何请求记录的用户,和原SQL返回结果不一致 - 聚合时必须加
DISTINCT对session_id去重:单个会话通常会对应多条请求记录,不去重会导致计数结果偏大,和原逻辑不符 - 无关联请求的用户计数逻辑自动对齐:左连接后没有匹配请求的用户,其关联的
request.session_id值为NULL,COUNT(DISTINCT ...)会自动忽略NULL值,最终返回会话数为0,和原写法表现完全一致 - 只要
user.id是user表的主键,上述GROUP BY user.id的写法在所有主流SQL数据库(MySQL、PostgreSQL、SQL Server等)中都符合语法规范,能正确返回每个用户的聚合结果。
内容的提问来源于stack exchange,提问作者John L.
相关产品推荐
相关产品推荐

