如何查询含复合键的联结表:获取用户id1的待处理请求
查询MySQL中待处理的用户连接请求
要获取指定用户(id1)的所有待处理请求,核心是筛选出从id1发出的请求,且对方尚未发起反向记录的条目。以下是两种可行的SQL实现方式:
方法一:使用NOT EXISTS子查询
这种方式通过子查询检查反向记录是否存在,逻辑直观清晰:
SELECT uc.* FROM user_connections uc WHERE uc.user_from = {你的id1值} AND NOT EXISTS ( SELECT 1 FROM user_connections uc_reverse WHERE uc_reverse.user_from = uc.user_to AND uc_reverse.user_to = uc.user_from );
逻辑说明
- 外层查询先取出所有由id1发出的请求
- 子查询验证是否存在对方(
user_to)向id1发起的反向记录,如果不存在,就说明该请求还处于待处理状态
方法二:使用LEFT JOIN筛选空值
通过左连接关联反向记录,再筛选出反向记录不存在的条目:
SELECT uc.* FROM user_connections uc LEFT JOIN user_connections uc_reverse ON uc_reverse.user_from = uc.user_to AND uc_reverse.user_to = uc.user_from WHERE uc.user_from = {你的id1值} AND uc_reverse.user_from IS NULL;
逻辑说明
- 左连接会保留所有id1发出的请求,无论是否有反向记录
- 当反向记录不存在时,
uc_reverse的字段会为NULL,通过这个条件筛选出待处理请求
优化建议
如果user_connections表数据量较大,建议给user_from和user_to创建联合索引,能大幅提升查询效率:
CREATE INDEX idx_user_from_to ON user_connections(user_from, user_to);
内容的提问来源于stack exchange,提问作者Elisha
相关产品推荐
相关产品推荐

