Ugh ok I’m terrible at explaining things, so I’ll just give you the quotes and links first:
Problem 4b (near bottom):
4b. List the film title and the leading actor for all of ‘Julie Andrews’ films.
movie(id, title, yr, score, votes, director)
actor(id, name)
casting(movieid, actorid, ord)
(Note: movie.id = casting.movieid, actor.id = casting.actorid)
My answer (doesn’t work):
SELECT title, name
FROM casting JOIN movie
ON casting.movieid = movie.id
JOIN actor
ON casting.actorid = actor.id
WHERE name = 'Julie Andrews'
AND ord = 1
The problem here is that it wants the list of lead actors of movies with ‘Julie Andrews’ as an actor (who is not necessarily the lead actor), but all I’m doing with my answer is getting the movies where she is the lead (ord = 1).
How do I specify the list of lead actors without ‘Julie Andrews’ being it? I suspect I have to do something with GROUP BY, but I can’t figure out what at the moment…
Edit: Do I need to use a nested SELECT?
Advertisement
Answer
There are wonderful ways of doing this with subqueries, but it appears that t this point in the tutorial you’re only working with JOINs. The following is how you would do it with only JOINs:
SELECT movie.title, a2.name FROM actor AS a1 JOIN casting AS c1 ON (a1.id = c1.actorid) JOIN movie ON (c1.movieid = movie.id) JOIN casting AS c2 ON (movie.id = c2.movieid) JOIN actor AS a2 ON (c2.actorid = a2.id) WHERE a1.name = 'Julie Andrews' AND c2.ord = 1
EDIT (more descriptive):
This will give us a table containing all of the movies Julie Andrews acted in. I’m aliasing the actor and casting tables as a1 and c1 respectively because now that we’ve found a list of movies, we’ll have to turn and match that against the casting table again.
SELECT movie.* FROM actor a1 JOIN casting c1 ON (a1.id = c1.actorid) JOIN movie ON (c1.movieid = movie.id) WHERE a1.name = 'Julie Andrews'
Now that we have a list of all movies she acted, we need to join that against the casting table (as c2) and that to the actor table (as a2) to get the list of leading roles for these films:
SELECT movie.title, -- we'll keep the movie title from our last query a2.name -- and select the actor's name (from a2, which is defined below) FROM actor a1 -- JOIN casting AS c1 ON (a1.id = c1.actorid) -- )- no changes here JOIN movie ON (c1.movieid = movie.id) -- / JOIN casting AS c2 ON (movie.id = c2.movieid) -- join list of JA movies to the cast JOIN actor AS a2 ON (c2.actorid = a2.id) -- join cast of JA movies to the actors WHERE a1.name = 'Julie Andrews' -- no changes AND c2.ord = 1 -- only select the star of the JA film
Edit: In aliasing, the ‘AS’ keyword is optional. I’ve inserted it above to help the query make more sense