2012-02-04 84 views
4

我已經把一個數據庫,我相信下面做事都「正確」的方式,(無冗餘數據等),如下圖所示:困難的SQL語句...四張桌子?

enter image description here

我希望顯示的存儲在提名表中的數據,而是通過一定的事件ID,並與電影標題年,和屢獲名稱。我知道基本的連接,但這似乎相當複雜 - 因爲我是一個新手。任何關於解決這個問題的正確方法的幫助,所以我可以在將來面對更復雜的問題,非常感謝!

+0

向我們顯示您使用的查詢。你似乎幾乎在那裏;你爲什麼停下了?! – 2012-02-04 17:36:59

+0

設計看起來不錯,但有幾個問題可以改進。例如,很難確保'Awards.name'存儲一個'Nominees.name'的名稱,該名稱實際上是爲同一個'Nomination'提名的。 – 2012-02-04 17:43:33

+0

@ypercube我不確定我關注。你能澄清嗎?謝謝。請注意,「Awards.name」是獎勵的名稱,是的? – 2012-02-04 18:01:15

回答

2

研究「加入」。這些是使用SQL的重要組成部分。一旦你有了一個可用的select語句,研究「views」並使用你的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,並在其他表中包含匹配的行。

作者Joe Celko撰寫了一些關於複雜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

首先使用立即限定符處理您的查詢,然後從中進行構建......您需要一個特定的「事件ID」類型,請到那裏。由於活動和儀式更多的是「查找」表格,你可能想要所有的資格提名,所以我實際上會從那裏開始。

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