SQL从两列选择中排除重复的列对

时间:2015-04-25 12:39:19

标签: sql select duplicates distinct rows

我真的不知道如何描述我的问题而且我还没有找到答案。 我有两个表,评级和评论者。如果他们评价同一部电影,我想为每一对评论者提供他们的名字。 我有这个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;

这是表结构:评级(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的重复行? 我希望我很清楚。感谢。

2 个答案:

答案 0 :(得分:0)

这是一个非常微妙的变化(>与您的!=相比),但您要做的是使用对角消除方法,即排除任何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; 的评论者目前的一个:

JOINs

这样,你就不会“重复计算”那些在对角线的对侧/对称侧已经匹配的评论者。

我也冒昧地将JOIN条件移动到WHERE,而不是FB.API("me/photos", Facebook.HttpMethod.POST, Callback, wwwForm);// it works well. FB.Feed("", "link", "link_name", ~~bulabula~~ );// it works well, too! 条款。

SqlFiddle here

答案 1 :(得分:0)

此查询选择每部电影的所有评论者,并将其与所有其他评论者配对(无论他们是否审阅过同一部电影)。然后,它使用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
)