如何匹配常见行?

How can I match common rows?

我有一个 table 这样的:

// friends
+----+---------+--------+
| id | user_id | friend |
+----+---------+--------+
| 1  | 1       | Peter  |
| 2  | 1       | Martin |
| 3  | 2       | Jack   |
| 4  | 1       | Barman |
| 5  | 3       | Peter  |
| 6  | 1       | Jack   |
| 7  | 3       | David  |
| 8  | 2       | David  |
| 9  | 3       | Martin |
+----+---------+--------+

现在我有两个 user_ids。例如 13。现在我想匹配有共同朋友的行。所以这是预期的结果:

| Peter  |
| Martin |

因为 PeterMartin 对于 id 13 都是通用的。

纯 sql 可以做到吗?

您可以进行 friends table 的自连接,需要满足以下三个条件才能匹配连接两侧的记录:

  1. 第一个 table 的 user_id1
  2. 第二个table的user_id3
  3. 好友匹配(即双方共享)


SELECT t1.friend
FROM friends t1
INNER JOIN friends t2
    ON t1.user_id = 1 AND
       t2.user_id = 3 AND
       t1.friend = t2.friend

如果您正确设置了索引,我希望它 运行 比聚合方法更快。

此处演示:

Rextester

另一种方式

SELECT friend
FROM t
GROUP BY friend
HAVING SUM(user_id =1)>0
AND SUM(user_id =3)>0

试试这个:

SELECT friend
FROM friends
WHERE user_id IN (1, 3) 
GROUP BY friend HAVING COUNT(DISTINCT friend) = 2;