可以使用以下SQL语句来查询用户"貂蝉"和"西施"是否在同一个会话中:
SELECT COUNT(DISTINCT chat_id) AS conversation_count
FROM pt_user_chat_relate
WHERE user_id IN (
SELECT id
FROM pt_user
WHERE nickname = '貂蝉' OR nickname = '西施'
)
GROUP BY chat_id
HAVING COUNT(DISTINCT user_id) = 2;
这条SQL语句首先通过子查询找到用户"貂蝉"和"西施"的ID,然后在关联表中查找这两个用户共同参与的会话,并统计这些会话的数量。最后,通过HAVING子句筛选出只有这两个用户参与的会话。
SELECT chat_id
FROM pt_user_chat_relate
WHERE user_id IN (
SELECT id
FROM pt_user
WHERE nickname = '貂蝉' OR nickname = '西施'
)
GROUP BY chat_id
HAVING COUNT(DISTINCT user_id) = 2;
SELECT chat_id FROM pt_user_chat_relate WHERE user_id IN ( SELECT id FROM pt_user WHERE nickname = '貂蝉' OR nickname = '西施' ) GROUP BY chat_id HAVING COUNT(DISTINCT user_id) = 2;
以下是使用MyBatis-Plus的Service方法来实现上述SQL查询的示例:
@Service
public class UserChatRelateService extends ServiceImpl<UserChatRelateMapper, UserChatRelate> {
public List<Integer> getCommonChatIdsForUsers(String user1, String user2) {
List<Integer> chatIds = this.baseMapper.getCommonChatIdsForUsers(user1, user2);
return chatIds;
}
}
在这个示例中,假设已经定义了名为UserChatRelate的实体类和对应的Mapper类UserChatRelateMapper。在Service类中定义了一个方法getCommonChatIdsForUsers,该方法调用了UserChatRelateMapper中自定义的方法getCommonChatIdsForUsers,该方法的具体实现如下:
@Mapper
public interface UserChatRelateMapper extends BaseMapper<UserChatRelate> {
@Select("SELECT chat_id FROM pt_user_chat_relate " +
"WHERE user_id IN " +
"(SELECT id FROM pt_user WHERE nickname = #{user1} OR nickname = #{user2}) " +
"GROUP BY chat_id " +
"HAVING COUNT(DISTINCT user_id) = 2")
List<Integer> getCommonChatIdsForUsers(@Param("user1") String user1, @Param("user2") String user2);
}
在UserChatRelateMapper接口中使用了@Select注解来定义了SQL查询语句,该查询语句与之前提供的SQL语句相同。然后在UserChatRelateService中调用了该方法来获取同时包含用户"貂蝉"和"西施"的会话的chat_id列表。
@Service
public class UserChatRelateService extends ServiceImpl<UserChatRelateMapper, UserChatRelate> {
public List<Integer> getCommonChatIdsForUsers(String user1, String user2) {
LambdaQueryWrapper<UserChatRelate> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(UserChatRelate::getUserId,
this.baseMapper.selectList(
Wrappers.<User>lambdaQuery().select(User::getId)
.eq(User::getNickname, user1)
.or()
.eq(User::getNickname, user2)
)
);
queryWrapper.groupBy(UserChatRelate::getChatId)
.having("COUNT(DISTINCT user_id) = 2");
List<UserChatRelate> userChatRelates = this.baseMapper.selectList(queryWrapper);
return userChatRelates.stream()
.map(UserChatRelate::getChatId)
.collect(Collectors.toList());
}
}