SQL 从两列中排除重复的列对 select
SQL exclude duplicated pairs of columns from a two-column select
我真的不知道如何描述我的问题,也没有找到答案。
我有两个表,评级和评论者。如果他们对同一部电影进行评分,我想为每一对评论者获取他们的名字。
我有这个 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 的重复行?
我希望我已经足够清楚了。谢谢。
这是一个非常细微的变化(>
与您的 !=
相比),但您想要做的是使用对角线消除方法,从而排除具有 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;
这样,您就不会 'double count' 对已经在对角线的相对/对称侧匹配的审稿人。
我还冒昧地将 JOIN 条件移动到 JOINs
,而不是 WHERE
子句中。
此查询选择每部电影的所有评论者并将他们与所有其他评论者配对(无论他们是否评论过同一部电影)。然后它使用 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
)
我真的不知道如何描述我的问题,也没有找到答案。 我有两个表,评级和评论者。如果他们对同一部电影进行评分,我想为每一对评论者获取他们的名字。 我有这个 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 的重复行? 我希望我已经足够清楚了。谢谢。
这是一个非常细微的变化(>
与您的 !=
相比),但您想要做的是使用对角线消除方法,从而排除具有 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;
这样,您就不会 'double count' 对已经在对角线的相对/对称侧匹配的审稿人。
我还冒昧地将 JOIN 条件移动到 JOINs
,而不是 WHERE
子句中。
此查询选择每部电影的所有评论者并将他们与所有其他评论者配对(无论他们是否评论过同一部电影)。然后它使用 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
)