sql select 演员一起出戏
sql select actors play together
actor/movies 查询有很多变体。在尝试从非组列 select 时,我找不到正确的方法:
我有 3 tables 电影(film_id, title), actor(actor_id, first_name, last_name), film_actor(actor_id, film_id).
所以,我需要找到 2 个演员,他们一起玩得最多,前 5 部这样的电影的输出显示为 actor1_last_name、actor2_last_name、film_title。
我在做的是先统计出场演员:
select r1.actor_id as actor_a, r2.actor_id as actor_b,
count(r1.film_id) as casted_together
from film_actor r1 inner join film_actor r2 on r1.film_id = r2.film_id
and r1.actor_id > r2.actor_id
group by r1.actor_id, r2.actor_id
order by casted_together desc
这个returns我table喜欢
actor_a | actor_b| casted_together
Name Name 7
... ... 6
但是当我尝试将 film.title 添加到 select 时,它说我不能使用它,以防它不在组部分 ((select title from film where film_id = r1.film_id) as film_title
) 中。 subquery uses ungrouped column "r1.film_id" from outer query
如何使用上述分组的结果并在其中添加一些外部列?在我的例子中是 film.title
.
期望的输出:
actor_a_last_name | actor_b_last_name| film_title
Name Name Title
... ... ...
比如说,乔治·克鲁尼和面包皮特合拍的电影数量最多 (9)
结果应该显示 9 行中的前 5 行
actor_a_last_name | actor_b_last_name| film_title
Clooney Pitt Film 1
Clooney Pitt Film 2
... ... ...
使用聚合,例如string_agg()
或 array_agg()
:
select
r1.actor_id as actor_a,
r2.actor_id as actor_b,
count(r1.film_id) as casted_together,
string_agg(f.title, ', ') as films
from film_actor r1
join film_actor r2
on r1.film_id = r2.film_id
and r1.actor_id > r2.actor_id
join film f
on r1.film_id = f.film_id
group by r1.actor_id, r2.actor_id
order by casted_together desc
使用查询作为派生 table 并添加演员姓名和电影名称:
select
a1.last_name,
a2.last_name,
f.title
from (
select
r1.actor_id as actor_a_id,
r2.actor_id as actor_b_id,
count(r1.film_id) as casted_together,
array_agg(r1.film_id) as film_ids
from film_actor r1
join film_actor r2
on r1.film_id = r2.film_id
and r1.actor_id > r2.actor_id
join film f
on r1.film_id = f.film_id
group by r1.actor_id, r2.actor_id
order by casted_together desc
limit 1
) s
join actor a1 on a1.actor_id = s.actor_a_id
join actor a2 on a2.actor_id = s.actor_b_id
join film f on f.film_id = any(s.film_ids)
actor/movies 查询有很多变体。在尝试从非组列 select 时,我找不到正确的方法: 我有 3 tables 电影(film_id, title), actor(actor_id, first_name, last_name), film_actor(actor_id, film_id). 所以,我需要找到 2 个演员,他们一起玩得最多,前 5 部这样的电影的输出显示为 actor1_last_name、actor2_last_name、film_title。 我在做的是先统计出场演员:
select r1.actor_id as actor_a, r2.actor_id as actor_b,
count(r1.film_id) as casted_together
from film_actor r1 inner join film_actor r2 on r1.film_id = r2.film_id
and r1.actor_id > r2.actor_id
group by r1.actor_id, r2.actor_id
order by casted_together desc
这个returns我table喜欢
actor_a | actor_b| casted_together
Name Name 7
... ... 6
但是当我尝试将 film.title 添加到 select 时,它说我不能使用它,以防它不在组部分 ((select title from film where film_id = r1.film_id) as film_title
) 中。 subquery uses ungrouped column "r1.film_id" from outer query
如何使用上述分组的结果并在其中添加一些外部列?在我的例子中是 film.title
.
期望的输出:
actor_a_last_name | actor_b_last_name| film_title
Name Name Title
... ... ...
比如说,乔治·克鲁尼和面包皮特合拍的电影数量最多 (9) 结果应该显示 9 行中的前 5 行
actor_a_last_name | actor_b_last_name| film_title
Clooney Pitt Film 1
Clooney Pitt Film 2
... ... ...
使用聚合,例如string_agg()
或 array_agg()
:
select
r1.actor_id as actor_a,
r2.actor_id as actor_b,
count(r1.film_id) as casted_together,
string_agg(f.title, ', ') as films
from film_actor r1
join film_actor r2
on r1.film_id = r2.film_id
and r1.actor_id > r2.actor_id
join film f
on r1.film_id = f.film_id
group by r1.actor_id, r2.actor_id
order by casted_together desc
使用查询作为派生 table 并添加演员姓名和电影名称:
select
a1.last_name,
a2.last_name,
f.title
from (
select
r1.actor_id as actor_a_id,
r2.actor_id as actor_b_id,
count(r1.film_id) as casted_together,
array_agg(r1.film_id) as film_ids
from film_actor r1
join film_actor r2
on r1.film_id = r2.film_id
and r1.actor_id > r2.actor_id
join film f
on r1.film_id = f.film_id
group by r1.actor_id, r2.actor_id
order by casted_together desc
limit 1
) s
join actor a1 on a1.actor_id = s.actor_a_id
join actor a2 on a2.actor_id = s.actor_b_id
join film f on f.film_id = any(s.film_ids)