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?
By the way, this was the answer posted on the site (I just found out about it):
Go figure. :P
Sharing an easy answer to this-
select title, name from movie join casting on movie.id=movieid join actor on actor.id=actorid where ord=1 and movie.id in (select movie.id from movie join casting on movie.id=movieid join actor on actor.id=actorid where name='Julie Andrews')
You want to match movies to two potentially separate rows in the
casting
table: one row where Julie Andrews is the actor, and the second row which may or may not be Julie Andrews, but which is the lead actor for the film.So you need to join to the
casting
table twice.Remember that "table aliases" reference potentially different rows, even if they are aliases to the same table.
Retreive all movies julie andrews played in, then for those movies retreive all movies and actors for them with ordinal number = 1, and distinct for unique results
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:
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.
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:
Edit: In aliasing, the 'AS' keyword is optional. I've inserted it above to help the query make more sense
@Bill Karwin 's answer is good for the direction. However, the result turns out some movies' title has been appear more than one time. So we need added a DISTINCT function before title in SELECT row.
And if you want more quick response, you also could write code in this way.