2012-02-04 59 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