我正在尝试自我加入关系演员(movie_id,cast_id,cast_name)。我想查询一对演员至少一起出现在 1 部电影中。必须排除自身对,并保留镜像对。这是关系表:
电影编号 | cast_id | cast_name |
---|---|---|
12345 | 10 | 中 |
12340 | 10 | 中 |
12341 | 10 | 中 |
12342 | 10 | 中 |
12343 | 11 | 蒂 |
12340 | 12 | 尼 |
12341 | 12 | 尼 |
12342 | 12 | 尼 |
12343 | 12 | 尼 |
12340 | 13 | 大卫 |
12345 | 12 | 尼 |
这是我尝试过的:
SELECT c.cast_id, c2.cast_id, c.movie_id
FROM casts c, casts c2
WHERE c.cast_id != c2.cast_id AND c.movie_id = c2.movie_id;
我没有得到成对的不同cast_id
,而是成对的相同cast_id
。
cast_id | cast_id | 电影编号 |
---|---|---|
10 | 10 | 12345 |
10 | 10 | 12340 |
10 | 10 | 12340 |
10 | 10 | 12341 |
10 | 10 | 12342 |
11 | 11 | 12343 |
12 | 12 | 12340 |
12 | 12 | 12340 |
12 | 12 | 12341 |
12 | 12 | 12342 |
12 | 12 | 12343 |
13 | 13 | 12340 |
13 | 13 | 12340 |
12 | 12 | 12345 |
但是,如果我尝试将其中一个属性替换为cast_name
喜欢,我会得到不同的演员对:
SELECT c.cast_name, c2.cast_id, c.movie_id
FROM casts c, casts c2
WHERE c.cast_id != c2.cast_id AND c.movie_id = c2.movie_id;
cast_id | cast_id | 电影编号 |
---|---|---|
尼 | 10 | 12345 |
大卫 | 10 | 12340 |
尼 | 10 | 12340 |
尼 | 10 | 12341 |
尼 | 10 | 12342 |
尼 | 11 | 12343 |
大卫 | 12 | 12340 |
中 | 12 | 12340 |
中 | 12 | 12341 |
中 | 12 | 12342 |
蒂 | 12 | 12343 |
尼 | 13 | 12340 |
中 | 13 | 12340 |
中 | 12 | 12345 |
您能否解释一下这种行为的原因以及如何解决它以获得预期的结果?谢谢!
为了解决您的问题,我执行了以下操作(下面的所有代码都可以在此处的小提琴中找到):
并填充它(注意这些对作为注释 - 有 7 对):
有 3 种可能的方法来做到这一点。
方法1(使用
cast_name
):结果:
这种方法的优点是,如果需要,它会按字母顺序
ORDER BY
在记录的下方 ( ) 和记录之间(a1.cast_name < a2.cast_name
) 显示名称。最大的缺点是3个重复Nguyen
的s已经消失了!方法2(使用
cast_id
):结果:
这里的优点是我们保留了
Nguyen
重复项,但现在名称没有按字母顺序在记录中排序。方法3(复杂):
结果:
瞧!结果按要求排序,我们有重复的
Nguyen
您可以根据需要省略字段。这个最终的解决方案使用了
LEAST()
andGREATEST()
函数(在这里解释得很好),这是 SQL 库中使用率最低的两个函数!将来,在问这样的问题时,您能否提供一下您的表结构和数据。