Php 困难的SQL语句。。。四张桌子?

Php 困难的SQL语句。。。四张桌子?,php,mysql,database,Php,Mysql,Database,我已经建立了一个数据库,我相信它遵循所有正确的方法,没有冗余数据,等等,如下所示: 我希望显示存储在提名表中的数据,但以某个EventID显示,并显示电影名称、年份和奖项名称。我知道基本连接,但这似乎很复杂-因为我是新手。非常感谢任何关于正确处理此问题的方法的帮助,以便我将来能够面对更复杂的问题 它实际上是一个基本连接,因此您应该已经知道:- 首先选择正确的提名,然后加入其他提名: SELECT nominations.nominationid, films.title,

我已经建立了一个数据库,我相信它遵循所有正确的方法,没有冗余数据,等等,如下所示:


我希望显示存储在提名表中的数据,但以某个EventID显示,并显示电影名称、年份和奖项名称。我知道基本连接,但这似乎很复杂-因为我是新手。非常感谢任何关于正确处理此问题的方法的帮助,以便我将来能够面对更复杂的问题

它实际上是一个基本连接,因此您应该已经知道:-

首先选择正确的提名,然后加入其他提名:

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 = ?

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

首先使用立即限定符进行查询,然后从该限定符进行构建。。。如果需要特定的事件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

学习加入。这些是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

显示您使用的查询。你好像快到了;你为什么停下来?!设计看起来不错,但有几个问题可以改进。例如,很难确保Awards.name存储为同一提名实际提名的被提名人的姓名。@ypercube我不确定是否遵循。你能澄清一下吗?谢谢请注意,Awards.name是该奖项的名称,是吗?哦,对不起,该奖项。名称类似于“最佳男主角”,而不是获奖者的名称。我误解了。没问题,这是正确的奖项。这个名字很可能包含最佳男主角。该结构是否存在其他问题?