查找actor在同一影片中具有多个不同角色的actor / movie行

时间:2015-04-18 07:51:06

标签: mysql sql database select

我有3张桌子,演员(id,姓名),电影(id,姓名)和演员表(援助,中间,角色)(辅助是演员ID,mid是电影ID)。我试图获得这样的输出: 如果演员在同一部电影中有超过3个不同的角色,则打印所有组合,例如:

-1.actor.name, movie.name, role1
-2.actor.name, movie.name, role2
-3.actor.name, movie.name, role3

我的查询是这样的:

select a.name, m.name, x.role
from actor a,
     movie m,
     (select distinct role
      from casts c
      where c.aid =a.id and c.mid = m.id
      group by c.aid and c.mid
      having count(distinct role) >=3) as x; 

但是我收到了错误消息:

  

多部分标识符" m.id"无法受约束。   多部分标识符" a.id"无法受约束。

请指出我的想法出错了,我希望下次能够做到这一点。感谢。

2 个答案:

答案 0 :(得分:2)

您的初始查询已关闭,但问题是您只能从子查询返回单个列,而您的casts表具有两个外键列的复合键*。

相反,您可以在派生表中进行艰苦的工作(就像在初始子查询中所做的那样)。派生表相对于子查询的好处是,您可以将其他表连接回两列以返回友好列名称:

select a.name, m.name, c.`role`
from 
(
    select aid, mid
    from casts
    group by aid, mid
    having count(distinct `role`) >= 3
) x
inner join actor a
    on a.id = x.aid
inner join movie m
    on m.id = x.mid
inner join casts c 
    on x.mid = c.mid and x.aid = c.aid;

*实际上,它也不是真正的关键,因为同一个actor可以在同一部电影中拥有多个角色。但我们正在寻找独特的组合,因此我们在GROUP BY

mid, aid之后就是独一无二的

SqlFiddle here - 忽略重复角色,并观察3个角色的阈值,观察同一部电影。

答案 1 :(得分:0)

在3个表之间进行连接,并进行子选择以验证至少3个不同的角色:

select a.name, m.name, c.role
from actor a
  join movie m on a.id = m.aid
  join casts c on m.id = c.mid and c.aid = a.id
where a.id in (select aid from casts
               where aid = a.id and mid = m.id
               group by aid, mid
               having count(distinct role) >=3)