我已经把一个数据库,我相信下面做事都“正确”的方式,(无冗余数据等),如下图所示:困难的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