如何避免以下SQL方案中的重复

时间:2016-06-17 03:49:20

标签: mysql

我有一个名为LIKES的表如下。

enter image description here

正如您所看到的,它有两列。 UserName1,UserName2。 这个表包含的是,如果一个人跟随其他人的facebook页面等。

例如,如果Jon跟随bobs页面,则表格中有一个条目为Jon,bob,如果bob跟随Jon facebook页面,则会有一个名为Bob,Jon的条目。

所以我想找出所有跟随对方个人资料的用户,我希望它没有重复。

我有以下查询,该查询提供了查找关注彼此配置文件的用户的结果。但我无法删除重复

SELECT L1.USERNAME1, L2.USERNAME2 
FROM LIKES L1, 
     LIKES L2 
WHERE L1.USERNAME1=L2.USERNAME2 
     AND L1.USERNAME2=L2.USERNAME1

给定表的最终输出应该是Jon Bob,或Bob,Jon,而不是两者。

我的查询给出了两个结果,如何删除重新列表中的重复项

2 个答案:

答案 0 :(得分:3)

首先,don't use comma-style joins。该语法已经过时了很长时间。其次,在这种情况下,您可以避免重复的一种方法是要求您在结果集中报告的名字按字母顺序排在第一个名称之前。您可以安全地执行此操作,因为结果集中出现的任何一对名称必须以两个顺序出现在源表中(例如(" Bob"," Jon")和(& #34; Jon"," Bob"))。我在这里假设您不需要处理跟随自己页面的用户的情况。例如:

select * 
from likes L1 
where 
    L1.username1 < L1.username2 and
    exists (select 1 from likes L2 where L1.username1 = L2.username2 and L1.username2 = L2.username1);

结果:

username1 username2
Bob       Jon

Click here表示使用示例数据演示此方法的SQL小提琴。

答案 1 :(得分:2)

看起来有点疯狂,但这确实有效:

select min(t.username1) as username1,
       max(t.username2) as username2
  from likes t
 group by least(t.username1, t.username2),
         greatest(t.username1, t.username2)
having count(distinct t.username1) = 2

SQLFiddle

编辑添加了having条款来处理我对OP问题的误解