困难的SQL语句......四个表?

时间:2012-02-04 17:24:06

标签: php mysql database

我已经整理了一个数据库,我相信它遵循所有“正确”的处理方式,(没有冗余数据等),如下所示:

enter image description here

我希望显示存储在提名表中的数据,但是显示某个 EventID ,以及电影标题,奖励名称。我知道基本的连接,但这似乎很复杂 - 因为我是一个新手。关于解决这个问题的正确方法的任何帮助,以及将来我可以面对更复杂的问题,非常感谢!

4 个答案:

答案 0 :(得分: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 = ?

实际上,除非要从Ceremonies表中检索数据,否则甚至不需要加入Events表。

答案 1 :(得分: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

答案 2 :(得分: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,并在其他表中包含匹配行。

一位名叫Joe Celko的作者撰写了几本关于复杂SQL语句的书籍。你可能会觉得他的工作很有用。

HTH

答案 3 :(得分: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