【问题标题】:SQL exclude duplicated pairs of columns from a two-column selectSQL 从两列选择中排除重复的列对
【发布时间】:2015-04-25 12:39:18
【问题描述】:

我真的不知道如何描述我的问题,也没有找到答案。 我有两张表,评级和审稿人。如果他们对同一部电影进行评分,我想为每一对评论者获取他们的名字。 我有这个 SQL 查询:

SELECT DISTINCT re1.name, re2.name 
FROM reviewer re1, reviewer re2, rating ra1, rating ra2
WHERE re1.rid=ra1.rid AND re2.rid=ra2.rid AND ra1.mid=ra2.mid AND re1.rid!=re2.rid;

这是表格结构:rating (rid, mid, stars, ratingdate), reviewer(rid, name)

这是我想要的:

NAME                       NAME              
Daniel Lewis               Elizabeth Thomas 
Elizabeth Thomas           James Cameron 
Ashley White               Chris Jackson
Mike Anderson              Sarah Martinez
Brittany Harris            Chris Jackson 

这是我得到的:

NAME                           NAME                         
------------------------------ ------------------------------
Daniel Lewis                   Elizabeth Thomas               
Elizabeth Thomas               James Cameron                  
Chris Jackson                  Brittany Harris                
Chris Jackson                  Ashley White                   
Ashley White                   Chris Jackson                  
James Cameron                  Elizabeth Thomas               
Mike Anderson                  Sarah Martinez                 
Sarah Martinez                 Mike Anderson                  
Elizabeth Thomas               Daniel Lewis                   
Brittany Harris                Chris Jackson   

如何删除 name1 和 name2 已被选为 name2, name1 的重复行? 我希望我足够清楚。谢谢。

【问题讨论】:

  • 花点时间帮助我们了解您的查询背后的逻辑,即您要解决什么问题、涉及的架构、这些架构中的样本数据,然后输出您所期望的。
  • 我想我已经解释了我训练要解决的问题,以及我期望的输出。这是我涉及的两个表中的数据:i57.tinypic.com/6qaz47.pngi62.tinypic.com/2v36cfs.png

标签: sql select duplicates distinct rows


【解决方案1】:

这是一个非常微妙的变化(> 与您的!=),但您要做的是使用对角线消除方法,即排除任何rid 低于当前值的评论者:

SELECT DISTINCT re1.name, re2.name 
FROM reviewer re1
  INNER JOIN rating ra1
    ON re1.rid=ra1.rid
CROSS JOIN
  reviewer re2
  INNER JOIN rating ra2
    ON re2.rid=ra2.rid
WHERE ra1.mid=ra2.mid AND  re1.rid > re2.rid;

这样,您就不会“重复计算”已经在对角线的相反/对称侧匹配的评论对。

我还冒昧地将 JOIN 条件移动到 JOINs,而不是 WHERE 子句中。

SqlFiddle here

【讨论】:

    【解决方案2】:

    此查询选择每部电影的所有评论者并将他们与所有其他评论者配对(无论他们是否评论过同一部电影)。然后它使用exists 只保留评论过同一部电影的评论者。

    select re1.name, re2.name
    from reviewer re1 join reviewer re2 on re2.rid < re1.rid
    join rating ra1 on ra1.rid = re1.rid
    where exists (
        select 1 from rating ra2
        where ra2.mid = ra1.mid
        and ra2.rid = re2.rid
    )
    

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 2013-02-03
      • 2016-02-27
      • 2022-08-16
      • 1970-01-01
      • 2014-01-13
      • 2019-04-06
      • 2015-05-06
      • 1970-01-01
      相关资源
      最近更新 更多