如何匹配常见行?
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。例如 1
和 3
。现在我想匹配有共同朋友的行。所以这是预期的结果:
| Peter |
| Martin |
因为 Peter
和 Martin
对于 id 1
和 3
都是通用的。
纯 sql 可以做到吗?
您可以进行 friends
table 的自连接,需要满足以下三个条件才能匹配连接两侧的记录:
- 第一个 table 的
user_id
是 1
- 第二个table的
user_id
是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
如果您正确设置了索引,我希望它 运行 比聚合方法更快。
此处演示:
另一种方式
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;
我有一个 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。例如 1
和 3
。现在我想匹配有共同朋友的行。所以这是预期的结果:
| Peter |
| Martin |
因为 Peter
和 Martin
对于 id 1
和 3
都是通用的。
纯 sql 可以做到吗?
您可以进行 friends
table 的自连接,需要满足以下三个条件才能匹配连接两侧的记录:
- 第一个 table 的
user_id
是1
- 第二个table的
user_id
是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
如果您正确设置了索引,我希望它 运行 比聚合方法更快。
此处演示:
另一种方式
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;