【问题标题】:How to avoid duplicates in following SQL scenario如何在以下 SQL 场景中避免重复
【发布时间】:2016-06-17 15:20:58
【问题描述】:

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

如您所见,它有两列。用户名 1,用户名 2。 此表包含的是,如果一个人关注其他人的 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,而不是两者。

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

【问题讨论】:

  • 但他/她确实提供了我今天见过的最丰富多彩的桌子插图。
  • @sstan, 数据库是 mysql ,我用sketch.io/sketchpad 创建图像:)

标签: mysql


【解决方案1】:

首先,don't use comma-style joins。这种语法已经过时了很长时间。其次,在这种情况下避免重复的一种方法是要求您在结果集中报告的名字按字母顺序出现在第一个之前。您可以安全地执行此操作,因为将出现在结果集中的任何一对名称必须以两个顺序出现在源表中(例如(“Bob”,“Jon”)和(“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 小提琴。

【讨论】:

    【解决方案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

    EDIT添加了having子句来处理我对OP问题的误解

    【讨论】:

    • 聪明,它避免了我假设这两个名字彼此不同的假设。 :)
    • @sstan,你的回答给出了一个没有关注其他人 Facebook 页面的输出。它应该只给出结果A跟随B和B跟随A,那么结果应该是A,B或B,A而不是两者。但是如果 A 只跟随 B 而不是反过来,那么它不应该出现在输出中
    • @Kltis:啊,我当时误解了这个问题。我以为你想要所有没有“逻辑”重复的行。不过,这是一个有趣的练习。
    • @Kltis:稍微编辑了查询以纠正我的误解。
    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多