You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

统计各用户会话数的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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:48:57