【问题标题】:Difficult SQL statement... Four tables?SQL语句难...四张表?
【发布时间】:2012-02-05 01:44:56
【问题描述】:

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

我希望显示存储在 Nominations 表中的数据,但是通过某个 EventID,并与电影 Title年份,以及奖项姓名。我知道基本连接,但这似乎很复杂——因为我是新手。任何有关解决此问题的正确方法的帮助,以便我将来可以面对更复杂的问题,非常感谢!

【问题讨论】:

  • 向我们展示您使用的查询。你似乎快到了;你为什么停下来?!
  • 设计看起来不错,但有几个问题可以改进。例如,很难确保Awards.name 存储实际上为相同Nomination 提名的Nominees.name 的名称。
  • @ypercube 我不确定我是否遵循。你能澄清一下吗?谢谢。请注意Awards.name 是奖项的名称,是吗?
  • 抱歉,Award.Name 类似于'Best actor',而不是获奖者的姓名。我误会了。
  • @ypercube 没问题,没错(Awards.name 可能包含Best Actor)。结构上还有其他问题吗?

标签: php mysql database


【解决方案1】:

研究“加入”。这些是使用 SQL 的重要组成部分。一旦你有了一个有效的选择语句,研究“视图”并使用你的选择语句创建一个新视图。

为了让您从这里开始,我想到了一个未经测试的使用连接的 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 语句的书。您可能会发现他的工作很有用。

【讨论】:

    【解决方案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 = ?
    

    事实上,您甚至不需要加入 Events 表,除非您想从 Ceremonies 表中检索数据。

    【讨论】:

      【解决方案3】:

      首先使用直接限定符处理您的查询,然后从它开始构建...您想要一个特定的“事件 ID”类型,去那里。由于 Events 和 Ceremonies 更像是“查找”表,因此您可能想要所有符合条件的提名,所以我实际上要从那里开始。

      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
      

      【讨论】:

        【解决方案4】:

        它实际上是一个基本连接,所以你应该已经知道了:-)

        先选择右边的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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-29
          • 2014-10-30
          • 2016-01-29
          • 1970-01-01
          • 2018-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多