2017-08-25 43 views
0

演员/电影查询有很多变化。我无法找到正确的方法,当试图从非组列中选择: 我有3个表格电影(film_id,title),actor(actor_id,first_name,last_name),film_actor(actor_id,film_id)。 所以,我需要找到2名演员,其中一起玩最多和显示输出actor1_last_name,actor2_last_name,film_title的前5部这样的电影。 我在做什么是第一,演员的计数外观:sql select演员一起玩

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 

这将返回我的表所示

actor_a | actor_b| casted_together 
Name  Name  7 
...  ...  6 

但是,一旦我尝试添加film.title选择,它说我可以”如果不在组合部分((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) 而测试结果将显示前5个9的线

actor_a_last_name | actor_b_last_name| film_title 
    Clooney    Pitt   Film 1 
    Clooney    Pitt   Film 2 
    ...     ...    ... 
+0

你能分享所需的输出 – Shuddh

回答

1

使用汇总,例如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 

使用查询作为派生表并添加演员的名字和片名:

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) 
+0

克林,它只是返回所有可能的影片列表,但我仍然需要找到'2名演员,其中一起玩最多和显示输出actor1_last_name,actor2_last_name,film_title的前5个这样的films',所以GROUP_BY应该在这里绝对 – Stan

+0

使用第一查询,并添加到它的加入到演员和电影一样在第二个。查看更新后的答案。 – klin

+0

'array_agg'的作品非常棒。谢谢 – Stan