2017-05-24 71 views
-1

我不知道如何在标题中解释这个问题,所以我会给你一个电影和演员的例子。MySQL - 查找演员一起工作过的其他演员

我有三个表(表名 - 字段):

actor - id, name 
movie - id, title 
actor_movie - actor_id, movie_id 

我想创造的是,在使用一个actor.id查询的WHERE子句和输出应该是谁的工作角色名单与这位演员合演电影。最好根据他们一起工作多少部电影来订购。

编辑:这是我现在得到的,但它不显示其他演员。它只能算演员157多少部电影已经在:

SELECT a.name, COUNT(m.title) movie_count 
FROM actor_movie 
JOIN actor 
ON actor.id = actor_movie.actor_id 
WHERE actor.id = 157 
GROUP BY actor.name 
ORDER BY movie_count DESC 
+0

出了什么问题?你有没有尝试过任何东西? –

+0

说实话,我不确定从哪里开始,而不是非常基本的SELECT。您的评论表明有一个简单的解决方案。 :) – Kaah

+0

开始学习。你需要'JOIN','COUNT','GROUP BY' –

回答

1

与演员选择电影,由演员选择电影中的其他演员,组和计数。

select a.id, a.name, count(*) 
from actor a 
join actor_movie am on am.actor_id = a.id 
where movie_id in (select movie_id from actor_movie where actor_id = @actor) 
and actor_id <> @actor -- remove this if you want to see how many movies the @actor has 
group by a.id 
order by count(*) desc; 

另一种方式来写:

select a.id, a.name, counted.movies 
from actor a 
join 
(
    select actor_id, count(*) as movies 
    from actor_movie 
    where movie_id in (select movie_id from actor_movie where actor_id = @actor) 
    and actor_id <> @actor -- remove this if you want to see how many movies the @actor has 
    group by actor_id 
) counted on counted.actor_id = a.id 
order by count(*) desc; 

而另一个:

select 
    actor_id, 
    (select name from actor a where a.id = am.actor_id) as name, 
    count(*) as movies 
from actor_movie am 
where movie_id in (select movie_id from actor_movie where actor_id = @actor) 
and actor_id <> @actor -- remove this if you want to see how many movies the @actor has 
group by actor_id 
order by count(*) desc; 
+0

非常感谢。我认为我需要一个子查询,但我没有在WHERE子句中使用它。 'actor_id <> @演员'是一个非常好的接触! 对于如何将问题标题更改为描述性,您有什么建议吗? – Kaah

+0

不客气。该标题完美适合您的问题。不要改变它。 –