如何比较两列中的重复值?

3

我有一张表,其中包含多个用户的ID以及他们各自朋友的ID,我想知道谁有共同的朋友。

例如,1是Roger的ID,2是Matt的ID。

朋友表格 字段/值:

ID, FRIEND_ID, FRIEND_NAME

1, 34, DAMON

1, 17, RICHARD

1, 56, DANIEL

1, 65, CHARLIE

2, 15, PRISCILA

2, 17, RICHARD

2, 45, JOHN

2, 56, DANIEL

我想创建一个ID为1和2的选择器,它将返回具有共同的FRIEND_ID(即Roger和Matt共有的朋友)的行,这种情况下,它将返回带有朋友ID RICHARD和DANIEL的列,最好不要重复。

为什么这个表中有“friends_name”?朋友已经有一个ID,所以我假设朋友被存储在另一个表中,包括它的名字等等... - Dirk McQuickly
@DirkMcQuickly:为了提高性能,略微去规范化表格是合理和常见的。如果经常访问朋友的姓名,则从这里获取比每次进行连接更快。 - Ayush
Dirk,这些名称在另一个表中,我只是为了更好地解释才把它放在那里,而且实际的表比那个大一点,但把它全部放出来是不必要的。 - von Goethe
@DirkMcQuickly:在极高的数据量情况下,去规范化表格是很常见的。在这种情况下,数据完整性不再得到保证,因此在进行更改时需要小心谨慎。以下是一篇关于Facebook如何去规范化表格以支持时间线功能的好文章。https://www.facebook.com/notes/facebook-engineering/building-timeline-scaling-up-to-hold-your-life-story/10150468255628920 - Ayush
@xbonez谢谢你。我觉得有点不对劲,特别是TP说他对数据库很菜。所以如果我的语气太严厉的话,我向von Goethe道歉。 - Dirk McQuickly
显示剩余2条评论
2个回答

4

这应该可以工作,

Select f1.FRIEND_ID,f1.FRIEND_NAME from 
FRIENDS f1,FRIENDS f2 where f1.FRIEND_ID =f2.FRIEND_ID and 
f1.id=1 and f2.id=2

这是一个示例:http://sqlfiddle.com/#!2/c9f36/1/0 如果您想获取所有具有共同好友的人,请尝试以下操作。
Select f1.FRIEND_ID,f1.FRIEND_NAME,f1.id 'first person',f2.id as 'second person' from 
FRIENDS f1,FRIENDS f2 where f1.FRIEND_ID =f2.FRIEND_ID and 
f1.id<>f2.id and f1.id<f2.id

这将返回每行具有相同朋友的两个人:http://sqlfiddle.com/#!2/c9f36/2/0


它完美无缺地运行了!谢谢Ankur,当涉及数据库时,我有点新手。 - von Goethe

3
SELECT friend_id, friend_name
FROM friends
WHERE id IN (1, 2)
GROUP BY friend_id
HAVING COUNT(*) > 1

DEMO.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接