2012-02-04 3 views
4

Я собрал базу данных, которую я считаю, следует все «правильные» способы ведения дел, (Нет избыточных данных и т.д.), как показано ниже:Сложный оператор SQL ... Четыре таблицы?

enter image description here

Я хочу, чтобы отобразить данные, сохраненные в таблицекандидатурам, но по определенному EVENTID, и с фильмом Названия и года, и награда Именем. Я знаю основные объединения, но это кажется довольно сложным - потому что я новичок. Любая помощь по правильному пути решения этой проблемы, поэтому я могу столкнуться с более сложными в будущем, очень ценится!

+0

Покажите нам запрос, который вы использовали. Кажется, вы почти там; почему вы остановились?! –

+0

Дизайн кажется хорошим, но есть несколько проблем, которые можно улучшить. Например, будет трудно гарантировать, что 'Awards.name' сохранит имя' Nominees.name', которое фактически было номинировано на ту же «Номинацию». –

+0

@ypercube Я не уверен, что я следую. Не могли бы вы уточнить? Благодарю. Обратите внимание, что имя 'Награды.name' - это название награды, да? –

ответ

2

Исследование «присоединяется». Это важная часть использования SQL. После того как у вас есть оператор select, который работает, изучите «представления» и создайте новое представление, используя оператор select.

Чтобы вы начали работу, это непроверенная, с верхней части моей головы, пример выражения select с использованием объединений. Также обратите внимание, что MySQL не является инструментом, который я часто использую, поэтому синтаксис, вероятно, неверен для MySQL.

SELECT A.Title, A.Year, C.Name, D.EventID 
FROM FILMS A 
JOIN NOMINATIONS B ON B.FilmID = A.FilmID 
JOIN AWARDS C ON C.AwardID = B.AwardID 
JOIN EVENTS D ON D.EventID = B.EventID 
WHERE EVENTS.EventID = XX 

Это будет работать, если все отношения существуют. Изучите «внешнее соединение», чтобы вытащить все строки данной таблицы, скажем, FILMS, и включить соответствующую строку в другие таблицы.

Автор по имени Джо Селко написал несколько книг по сложным операциям SQL. Вы можете найти его работу полезной.

hth

1

Это на самом деле основной присоединиться, так что вы должны знать об этом уже :-)

Сначала выберите право nominations, а затем присоединиться к остальным с ним:

SELECT nominations.nominationid, 
     films.title, 
     films.year, 
     awards.name 
FROM nominations 
JOIN films 
ON films.filmid = nominations.filmid 
JOIN awards 
ON awards.awardid = nominations.awardid 
WHERE nominations.eventid = :event_id 
2

Это, безусловно, право способ структурирования этих данных, так как это позволит вам суммировать ваши данные довольно лаконично. В самом деле, запрос вы ищете простой ряд объединений:

SELECT 
    n.*, 
    f.Year, 
    f.Title, 
    a.Name 
FROM `nominations` n 
INNER JOIN `events` e ON n.EventID = e.EventID 
INNER JOIN `films` f ON n.FilmID = f.FilmID 
INNER JOIN `awards` a ON n.AwardID = a.AwardID 
WHERE n.EventID = ? 

В самом деле, вам даже не нужно зарегистрироваться на столе событий, если вы не хотите, чтобы извлечь данные из таблицы Церемонии ,

2

Сначала выполните свой запрос с помощью первого квалификатора, а затем постройте его ... Вам нужен конкретный тип «Идентификатор события», идите туда. Поскольку «События и церемонии» - это больше «Lookup», вам, вероятно, нужны все квалификационные номинации, поэтому я собираюсь начать там.

select 
     JustNominees.*, 
     f.Title, 
     f.Year as FilmYear, 
     a.Name as AwardName 
    from 
     (select 
       n.*, 
       e.Name as EventName, 
       c.Year as CeremonyYear 
      from 
       Nominations n 
       join Events e 
        on n.EventID = e.EventID 
        join Ceremonies c 
         on e.CeremonyID = c.CeremonyID 
      where 
       e.EventID = WhatEventID) JustNominees 
     join Films f 
     on JustNominees.FilmID = f.FilmID 
     join Awards a 
     on JustNominees.AwardID = a.AwardID 
Смежные вопросы