SQL如何查询匹配正反顺序ID对的唯一好友关系单行记录
无序ID匹配唯一好友关系的SQL实现
问题根因
你之前写的SQL无法返回正确结果,有两个核心问题:
- 字段名和实际表结构不匹配:friends表的好友字段为
id_one(好友发起方)、id_two(好友接收方),你写的friend_one_id、friend_two_id和实际表字段不一致 - 条件逻辑错误:
(id_one=? OR id_two=?) AND (id_one=? OR id_two=?)的写法会匹配到任意一个ID出现在好友位的所有记录,无法精准锁定两个ID刚好组成好友对的记录,甚至会查出单个ID对应的其他无关好友关系。
正确写法
因为表中好友对是全局唯一的,只需要覆盖两个ID的两种排列组合作为匹配条件即可,不会返回重复记录。
写法1:通用兼容写法
所有支持SQL标准的数据库都可以用这个写法:
SELECT * FROM friends WHERE (id_one = ? AND id_two = ?) OR (id_one = ? AND id_two = ?);
参数绑定顺序:四个占位符按顺序传入「待查ID1、待查ID2、待查ID2、待查ID1」即可。
以你给出的示例为例,待查ID是10987633和01223995,参数依次传入"10987633", "01223995", "01223995", "10987633",就会精准返回id_one=01223995, id_two=10987633的目标记录。
写法2:简洁元组匹配写法
MySQL、PostgreSQL等主流数据库都支持元组匹配,写法更简洁易读,逻辑和上面完全一致:
SELECT * FROM friends WHERE (id_one, id_two) IN ( (?, ?), (?, ?) );
参数绑定顺序和写法1完全相同。
注意:按照你描述的业务规则,两个用户之间只会存储一条好友关系记录(不会同时存A->B和B->A两条重复数据),上面的写法永远只会返回0或1条记录,完全匹配业务需求。
内容的提问来源于stack exchange,提问作者xxSithRagexx
相关产品推荐
相关产品推荐

