SQL理解——INNER JOIN
文章目录
- SQL语句
- 需求
- 使用 INNER JOIN 的原因
SQL语句
/*** 查询两个用户之间共有的单聊 sessionId** @param userId1 第一个用户的ID* @param userId2 第二个用户的ID* @return 共有的单聊 sessionId 列表*/@Select("SELECT us1.session_id " +"FROM user_session us1 " +"INNER JOIN user_session us2 ON us1.session_id = us2.session_id " +"INNER JOIN session s ON us1.session_id = s.id " +"WHERE us1.user_id = #{userId1} " +"AND us2.user_id = #{userId2} " +"AND s.type = 1 " +"AND s.status = 1 " +"AND us1.status = 1 " +"AND us2.status = 1")List<Long> findCommonSingleChatSessionIds(@Param("userId1") Long userId1, @Param("userId2") Long userId2);
需求
在代码中,目标是查询两个用户之间共有的单聊会话sessionId。
具体需求是:
找到两个用户都参与的会话。
确保这些会话是单聊(type = 1)且状态有效(status = 1)。
使用 INNER JOIN 的原因
匹配需求:代码的目标是找到两个用户都参与的会话,这意味着只有当两个用户在user_session表中都有记录时,才认为这是一个有效的会话。INNER JOIN正好满足这个需求,它只返回两个表中匹配的记录。
数据完整性:在这个场景中,我们不需要保留任何一个用户的所有记录,而是需要找到两个用户共同参与的会话。因此,INNER JOIN是更合适的选择。
性能优化:INNER JOIN通常比LEFT JOIN更高效,因为它只处理匹配的记录。在这个场景中,使用INNER JOIN可以提高查询效率。
使用 LEFT JOIN 的问题:
返回多余的数据:LEFT JOIN会返回左表中的所有记录,即使右表中没有匹配的记录。这会导致查询结果中包含不相关的数据,不符合我们的需求。
性能下降:LEFT JOIN需要处理更多的数据,尤其是当左表比右表大得多时。这可能会导致查询效率降低。