我有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"无法受约束。
请指出我的想法出错了,我希望下次能够做到这一点。感谢。
答案 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)