如何通过SQL JOIN关联两张表以获取预期统计结果?
问题分析与解决办法
首先看你的问题:原查询得到的两个计数都是7,是因为你用了COUNT(sessions.sid)——右连接会保留sessions的所有行,而sessions.sid在每一行都不为空,所以这个计数会把所有session都算进去,不管有没有在events里找到匹配的sid。
要得到预期结果,我们需要调整两个点:
- 去掉查询中的
sessions.sid,因为你要的是全局总数,不是按sid分组统计(原查询如果没有GROUP BY,数据库可能会隐式分组,但这不是你要的结果)。 - 把
COUNT(sessions.sid)改成COUNT(events.sid),因为当sessions的sid在events里找不到匹配时,events.sid会是NULL,而COUNT函数会自动忽略NULL值,这样就能统计到真正匹配上的session数量。
修改后的SQL语句如下:
SELECT COUNT(*) AS Total_sessions, COUNT(events.sid) AS Total_equal_sessions FROM sessions LEFT JOIN events ON sessions.sid = events.sid
这里用LEFT JOIN比RIGHT JOIN更直观,因为我们是以sessions为基准表,去关联events里的匹配数据。执行这个语句后:
COUNT(*)会统计sessions的总记录数,也就是7;COUNT(events.sid)只会统计那些在events中找到对应sid的session记录,也就是4,正好符合你的预期结果。
内容的提问来源于stack exchange,提问作者The Dead Man
相关产品推荐
相关产品推荐

