查询一下哪个会话同时有用户“貂蝉“和“西施“

文章介绍了如何使用MyBatis-Plus框架,通过Service和Mapper接口,不直接编写SQL语句,实现查询用户貂蝉和西施是否在同一个会话中的功能,以及获取这些会话的chat_id列表。
摘要由CSDN通过智能技术生成
查询一下用户貂蝉和西施有没有在同一个会话里

可以使用以下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方法写出来

以下是使用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列表。

能不能在不使用@Select、不写sql语句的情况下,单纯的靠mybatis-plus的service写出来
@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());
    }
}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值