0

所以我有一个保存友谊请求的数据库表。我需要做的是找到丢失的对。这个例子是这样的:

一个适当的价值是

朋友 A > 朋友 B
和
朋友 B > 朋友 A  

我想做的是找到缺失的伙伴关系。因此,如果您有Friend A > Friend B,并且缺少相反的内容。我想列出缺少的那些。

我一辈子都无法用最好的方法来完成这一点。有什么建议么?

4

2 回答 2

3

你可以这样做

SELECT MIN(user_id) user_id,
       MIN(friend_id) friend_id
  FROM Table1
 GROUP BY LEAST(user_id, friend_id),
          GREATEST(user_id, friend_id)
HAVING COUNT(*) = 1

给定样本数据

| USER_ID | FRIEND_ID |
|---------|------------|
| 1 | 2 |
| 2 | 1 |
| 1 | 3 |
| 2 | 4 |
| 5 | 6 |
| 6 | 5 |

查询的输出

| USER_ID | FRIEND_ID |
|---------|------------|
| 1 | 3 |
| 2 | 4 |

这是SQLFiddle演示

于 2013-08-30T03:15:18.707 回答
0

您可以使用以下not exists子句执行此操作:

select f.B as A, f.A as B
from friends f
where not exists (select 1
                  from friends f2
                  where f2.A = f.B and f2.B = f.A
                 );

select条款为您提供了缺少的条款。就个人而言,我只是select f.*为了得到无与伦比的朋友。

于 2013-08-30T03:15:50.527 回答