我已經把一個數據庫,我相信下面做事都「正確」的方式,(無冗餘數據等),如下圖所示:困難的SQL語句...四張桌子?
我希望顯示的存儲在提名表中的數據,而是通過一定的事件ID,並與電影標題和年,和屢獲名稱。我知道基本的連接,但這似乎相當複雜 - 因爲我是一個新手。任何關於解決這個問題的正確方法的幫助,所以我可以在將來面對更復雜的問題,非常感謝!
我已經把一個數據庫,我相信下面做事都「正確」的方式,(無冗餘數據等),如下圖所示:困難的SQL語句...四張桌子?
我希望顯示的存儲在提名表中的數據,而是通過一定的事件ID,並與電影標題和年,和屢獲名稱。我知道基本的連接,但這似乎相當複雜 - 因爲我是一個新手。任何關於解決這個問題的正確方法的幫助,所以我可以在將來面對更復雜的問題,非常感謝!
研究「加入」。這些是使用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
事實上,這是一個基本的加入,所以你應該已經知道了:-)
首先選擇合適的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
這肯定是正確的這種方式來構建這些數據,因爲它可以讓你很簡潔地彙總你的數據。事實上,你正在尋找的查詢是一個簡單的一系列聯接:
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 = ?
事實上,你甚至都不需要加入對事件表,除非你想檢索來自儀式表數據。
首先使用立即限定符處理您的查詢,然後從中進行構建......您需要一個特定的「事件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
向我們顯示您使用的查詢。你似乎幾乎在那裏;你爲什麼停下了?! – 2012-02-04 17:36:59
設計看起來不錯,但有幾個問題可以改進。例如,很難確保'Awards.name'存儲一個'Nominees.name'的名稱,該名稱實際上是爲同一個'Nomination'提名的。 – 2012-02-04 17:43:33
@ypercube我不確定我關注。你能澄清嗎?謝謝。請注意,「Awards.name」是獎勵的名稱,是的? – 2012-02-04 18:01:15