Select 个不同的对在 sql 中将 table 连接到自身
Select distinct pairs joining a table to itself in sql
我有一个包含两行的 table:IMDB_ID 和 Actor。我试图找到共同出演 3 部或更多电影的演员对。这对名字应该是唯一的,这意味着“演员 A,演员 B”和“演员 B,演员 A”是同一对,因此应该只出现其中一个。这是 table 的几行,但不是全部:
IMDB_ID ACTOR
---------- -----------
tt0111161 Tim Robbins
tt0111161 Morgan Free
tt0111161 Bob Gunton
tt0111161 William Sad
tt0111161 Clancy Brow
tt0111161 Gil Bellows
tt0111161 Mark Rolsto
tt0111161 James Whitm
tt0111161 Jeffrey DeM
tt0111161 Larry Brand
tt0111161 Neil Giunto
tt0111161 Brian Libby
tt0111161 David Prova
tt0111161 Joseph Ragn
tt0111161 Jude Ciccol
tt0068646 Marlon Bran
tt0068646 Al Pacino
我试过:
SELECT DISTINCT movie_actor.actor, movie_actor.actor, COUNT(movie_actor.actor) AS occurrence
FROM movie_actor join movie_actor
ON movie_actor.imdb_id = movies.imdb_id
WHERE occurrence >= 3
GROUP BY movie_actor.actor
ORDER BY occurrence DESC, movie_actor.actor ASC;
并收到一个操作错误:
不明确的列名称:movie_actor.actor
更新:
最终的可行解决方案如下(*注意单向不等式运算符,它可以防止反向重复对):
SELECT DISTINCT ma.actor, ma2.actor, COUNT(*) AS occurrence
FROM movie_actor ma join movie_actor ma2
ON ma.imdb_id = ma2.imdb_id
WHERE ma.actor > ma2.actor
GROUP BY ma2.actor, ma.actor
HAVING occurrence >= 3
ORDER BY occurrence DESC, ma2.actor ASC
您应该在使用自联接时使用 table 别名。但是,你的查询有很多问题,说明你需要多练习写作SQL。一些好习惯:
- 始终使用 table 别名,即 table 名称的缩写。
- 总是限定列名
- 如果您有此意图,请记住使用
having
子句。
这里SQL更接近你想做的事情:
SELECT ma.actor, ma2.actor, COUNT(*) AS occurrence
FROM movie_actor ma join
movie_actor ma2
ON ma.imdb_id = ma2.imdb_id
GROUP BY ma.actor, ma2.actor
HAVING COUNT(*) >= 3
ORDER BY occurrence DESC, ma.actor ASC;
我有一个包含两行的 table:IMDB_ID 和 Actor。我试图找到共同出演 3 部或更多电影的演员对。这对名字应该是唯一的,这意味着“演员 A,演员 B”和“演员 B,演员 A”是同一对,因此应该只出现其中一个。这是 table 的几行,但不是全部:
IMDB_ID ACTOR
---------- -----------
tt0111161 Tim Robbins
tt0111161 Morgan Free
tt0111161 Bob Gunton
tt0111161 William Sad
tt0111161 Clancy Brow
tt0111161 Gil Bellows
tt0111161 Mark Rolsto
tt0111161 James Whitm
tt0111161 Jeffrey DeM
tt0111161 Larry Brand
tt0111161 Neil Giunto
tt0111161 Brian Libby
tt0111161 David Prova
tt0111161 Joseph Ragn
tt0111161 Jude Ciccol
tt0068646 Marlon Bran
tt0068646 Al Pacino
我试过:
SELECT DISTINCT movie_actor.actor, movie_actor.actor, COUNT(movie_actor.actor) AS occurrence
FROM movie_actor join movie_actor
ON movie_actor.imdb_id = movies.imdb_id
WHERE occurrence >= 3
GROUP BY movie_actor.actor
ORDER BY occurrence DESC, movie_actor.actor ASC;
并收到一个操作错误: 不明确的列名称:movie_actor.actor
更新:
最终的可行解决方案如下(*注意单向不等式运算符,它可以防止反向重复对):
SELECT DISTINCT ma.actor, ma2.actor, COUNT(*) AS occurrence
FROM movie_actor ma join movie_actor ma2
ON ma.imdb_id = ma2.imdb_id
WHERE ma.actor > ma2.actor
GROUP BY ma2.actor, ma.actor
HAVING occurrence >= 3
ORDER BY occurrence DESC, ma2.actor ASC
您应该在使用自联接时使用 table 别名。但是,你的查询有很多问题,说明你需要多练习写作SQL。一些好习惯:
- 始终使用 table 别名,即 table 名称的缩写。
- 总是限定列名
- 如果您有此意图,请记住使用
having
子句。
这里SQL更接近你想做的事情:
SELECT ma.actor, ma2.actor, COUNT(*) AS occurrence
FROM movie_actor ma join
movie_actor ma2
ON ma.imdb_id = ma2.imdb_id
GROUP BY ma.actor, ma2.actor
HAVING COUNT(*) >= 3
ORDER BY occurrence DESC, ma.actor ASC;