Как мне вывести первое значение из запроса трехсторонней объединенной таблицы? - PullRequest
1 голос
/ 12 января 2009

Тьфу хорошо, я ужасно объясняю вещи, поэтому сначала я просто дам вам цитаты и ссылки:

Задача 4b (в нижней части):

4b. Укажите название фильма и главную роль во всех фильмах Джули Эндрюс.

фильм (id, название, год, оценка, голоса, режиссер)
актер (имя, имя)
кастинг (movieid, actorid, ord)
(Примечание: movie.id = casting.movieid, actor.id = casting.actorid)

Мой ответ (не работает):
SELECT title, name<br /> FROM casting JOIN movie<br /> ON casting.movieid = movie.id<br /> JOIN actor<br /> ON casting.actorid = actor.id<br /> WHERE name = 'Julie Andrews'<br /> AND ord = 1

Проблема здесь в том, что ему нужен список ведущих актеров фильмов с «Джули Эндрюс» в качестве актера (который не обязательно является ведущим актером), но все, что я делаю с моим ответом, - это получение фильмов, где она это лидерство (ord = 1).

Как мне указать список ведущих актеров, не говоря о «Джули Эндрюс»? Я подозреваю, что должен что-то сделать с GROUP BY, но я не могу понять, что в данный момент ...

Редактировать: Нужно ли использовать вложенный SELECT?

Ответы [ 9 ]

6 голосов
/ 12 января 2009

Есть замечательные способы сделать это с помощью подзапросов, но, похоже, что в этом уроке вы работаете только с JOIN. Вот как вы это сделаете, используя только JOIN:

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

РЕДАКТИРОВАТЬ (более наглядно):

Это даст нам таблицу, содержащую все фильмы, в которых принимала участие Джули Эндрюс. Я делаю псевдонимы для актеров и таблицы приведений соответственно как a1 и c1, потому что теперь, когда мы нашли список фильмов, нам придется поверните и сравните это с литейным столом снова.

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'

Теперь, когда у нас есть список всех фильмов, которые она сыграла, нам нужно соединить его с таблицей ролей (как c2) и с таблицей актеров (как a2), чтобы получить список главных ролей для этих фильмов:

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

Редактировать: в псевдонимах ключевое слово 'AS' является необязательным. Я вставил его выше, чтобы сделать запрос более понятным

4 голосов
/ 12 января 2009

Вы хотите сопоставить фильмы с двумя потенциально отдельными строками в таблице casting: одна строка, где Джули Эндрюс является актером, а вторая строка, которая может быть или не быть Джули Эндрюс, но которая является ведущим актером для фильм.

Джули <---> снялась в <---> фильме <---> в главной роли <---> главный актер

Итак, вам нужно присоединиться к таблице casting дважды.

SELECT m.title, lead.name
FROM actor AS julie
 JOIN casting AS c1 ON (julie.id = c1.actorid)
 JOIN movie AS m ON (c1.movieid = m.id)
 JOIN casting AS c2 ON (m.id = c2.movieid)
 JOIN actor AS lead ON (c2.actorid = lead.id)
WHERE julie.name = 'Julie Andrews'
 AND c2.ord = 1;

Помните, что «псевдонимы таблиц» ссылаются на потенциально разные строки, даже если они являются псевдонимами одной и той же таблицы.

3 голосов
/ 12 января 2009
SELECT title, name
      FROM casting JOIN movie
              ON casting.movieid = movie.id
      JOIN actor
              ON casting.actorid = actor.id
     WHERE ord = 1
     and   casting.movieid in 
          (select movieid
           from   casting
                  join actor
                      on actor.id = casting.actorid
           where  actor.name = 'Julie Andrews')
1 голос
/ 12 января 2009

Кстати, это был ответ, размещенный на сайте (я только что узнал об этом):

SELECT title, name
  FROM movie, casting, actor
  WHERE movieid=movie.id
    AND actorid=actor.id
    AND ord=1
    AND movieid IN
    (SELECT movieid FROM casting, actor
     WHERE actorid=actor.id
     AND name='Julie Andrews')

Пойди разберись. : P

0 голосов
/ 13 января 2019
SELECT title , name
FROM movie JOIN casting ON (casting.movieid=movie.id) JOIN actor ON (actor.id=actorid)
WHERE (movieid IN (SELECT movieid
FROM casting JOIN actor ON (actor.id=actorid)
WHERE name =  'Julie Andrews')) AND (ord=1)
0 голосов
/ 31 января 2018

Обмен легким ответом на это-

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')

0 голосов
/ 08 сентября 2016
I ve done simply like this

select distinct title,name from 
(select movie.* from movie
inner join casting on (movie.id = casting.movieid)
inner join actor on (casting.actorid = actor.id)
where actor.name = 'Julie Andrews' ) as moviesFromJulie

inner join casting on (moviesFromJulie.id = casting.movieid)
inner join actor on (casting.actorid = actor.id)
where ord = 1

Получить все фильмы, в которых играла Джули Эндрюс, затем для этих фильмов восстановить все фильмы и актеров для них с порядковым номером = 1 и отличаться для уникальных результатов

0 голосов
/ 07 августа 2015

@ Ответ Билла Карвина хорош для направления. Однако в результате выясняется, что название некоторых фильмов появлялось более одного раза. Поэтому нам нужно добавить функцию DISTINCT перед заголовком в строке SELECT.

SELECT DISTINCT m.title, lead.name

И если вам нужен более быстрый ответ, вы также можете написать код таким образом.

SELECT DISTINCT m.title, lead.name
 FROM actor AS julie
  JOIN casting AS c1 ON (julie.id = c1.actorid AND julie.name = 'Julie Andrews')
  JOIN movie AS m ON (c1.movieid = m.id)
  JOIN casting AS c2 ON (m.id = c2.movieid)
  JOIN actor AS lead ON (c2.actorid = lead.id)
 WHERE  c2.ord = 1;
0 голосов
/ 22 мая 2015
select title, name  from movie join casting on movie.id=movieid
join actor on actor.id=actorid 
where ord=1 and movieid in (select movieid from actor join casting 
                                            on actor.id=actorid 
         where name='julie andrews' and (ord=1 or ord<>1))group by title, name
...