SQL - 查找ADAM GRANT所执行的所有电影的电影标题和语言名称

时间:2016-11-10 19:42:27

标签: mysql sql

对于像这样的问题,我在SQL方面遇到了很多麻烦。我不知道我应该如何构建我的查询。我应该film加入film_actor,然后加入actor吗?或者我应该反过来做什么?

我所能做的就是获取一个将actorfilm_actor与名称ADAM GRANT连接在一起的查询,但我已经迷失了从这里开始的地方。

SELECT * FROM (actor JOIN film_actor ON actor.actor_id=film_actor.actor_id) WHERE first_name = 'ADAM' AND last_name = 'GRANT'

我已经尝试过将这些结果与电影结合起来,但是我的语法出现了问题。

SELECT title FROM (actor JOIN film_actor ON actor.actor_id=film_actor.actor_id) WHERE first_name = 'ADAM' AND last_name = 'GRANT' JOIN film ON film.actor_id = actor_id

2 个答案:

答案 0 :(得分:2)

您应该使用内部联接

SELECT 
   film.title
  , language.name
FROM film
INNER JOIN language on film.language_id = language.language_id
INNER JOIN film_actor on film.film_id = film_actor.film_id
INNER JOIN actor on actor.actor_id = film_actor.actor_id
WHERE actor.first_name = 'ADAM'
AND actor.last_name ='GRANT'

答案 1 :(得分:0)

您可以使用NATURAL JOIN从查询中删除范围变量(film_actoractor),以及“说明明显的开花”搜索条件(actor_id = actor_id ):

  SELECT title AS film_title, name AS language_name
    FROM film 
         NATURAL JOIN film_actor
         NATURAL JOIN actor
         NATURAL JOIN language
   WHERE first_name = 'ADAM'
         AND last_name ='GRANT';

我不是思想流派的忠实粉丝,其中“语言名称”这样的数据元素只被称为name而上下文language应该来自表格名称。什么在Java类中运行良好并不一定转换为SQL,这就是为什么我发现我需要在查询中使用重命名(SELECT name AS language_name...)。此外,您在name中有一个category属性,如果NATURAL JOIN包括languagecategory,则会遇到问题。最好在整个模式中拥有唯一且一致的属性名称,例如,您已成功完成actor_id