由于内部连接而产生的笛卡尔积

时间:2013-12-22 18:13:26

标签: mysql sql join cartesian

我有两个表:演员和电影,以及连接它们的第三个表角色。 ActorId是演员的主键。 MovieCode是电影表的主键。我有一个演员的页面,我需要显示电影发布的日期,电影的名称和演员的角色。 我的疑问是:

SELECT mo.date, mo.title, role.roleDescription
FROM movies mo, role
inner join actors
on role.actorId=actors.actorId
inner join movies 
on role.movieCode=movies.movieCode
where role.actorid=2

查询返回笛卡尔积。可能是什么问题?提前谢谢你!

2 个答案:

答案 0 :(得分:2)

问题在于您加入movies两次:一次为mo,一次为movies。任何mo子句或ON子句中都不会提及WHERE,因此您永远不会过滤掉mo的任何值。要解决此问题,只需删除movies mo,部分,然后更改SELECT - 列表中的字段即可使用movies代替mo

SELECT movies.date, movies.title, role.roleDescription
FROM role
inner join actors
on role.actorId=actors.actorId
inner join movies 
on role.movieCode=movies.movieCode
where role.actorid=2

此外,您实际上不需要加入actors,因为您没有从actors中选择任何内容,而且您已经知道了actorid的所需价值。所以删除它,并重新调整一点,以明确:

SELECT movies.date,
       movies.title,
       role.roleDescription
  FROM movies
  JOIN role
    ON role.movieCode = movies.movieCode
 WHERE role.actorid = 2
;

答案 1 :(得分:0)

尝试这个,因为你想为特定的演员选择演员的电影和角色,你可以跳过演员表上的连接,也可以在你的查询中两次加入电影

SELECT mo.date, mo.title, r.roleDescription
FROM movies mo, 
INNER JOIN role r
ON r.movieCode=mo.movieCode
WHERE r.actorid=2
相关问题