-2

我有一个带表格的电影数据库

  1. 电影表;
  2. 数据表
  3. 人表
  4. 字符表
  5. 模式表

电影桌

===============================================
CODE : TITLE :        DESCRIPTION       YEAR
=====================================================
1      IRON MAN 3       xxxxx          2013
2      STAR WARS        xxxxx          2013

人员表

===============================================
CODE : NAME:                 BIRTH_DATE
=====================================================
1      SHANE BLACK         1965:04:04 00:00:00
2      ROBERT DOWNEY       1965:04:04 00:00:00
3      Gwyneth Paltrow     1965:04:04 00:00:00
4      Don Cheadle         1965:04:04 00:00:00

字符表

===============================================
PERSON  : NAME:             MOVIE
=====================================================
2      TONY STARK          1
3      PEPPER POTTS        1
4      Col. James Rhodes   1

模式表

===============================================
CODE : NAME : 
=====================================================
1      DIRECTOR 
2      WRITER
3      ACTOR
4      CHARACTER

数据表

===============================================
CODE : MOVIE :     PERSON   MODE
=====================================================
1      1             1       1
2      1             2       3 
3      1             3       3 
4      1             4       3 

最终答案如下:

===============================================
CODE : MOVIE TITLE :  DIRECTOR  :     ACTORS           CHARACTERS
=====================================================
1      IRON MAN 3     SHANE BLACK   Robert Downey Jr.   Tony Stark
                                    Gwyneth Paltrow     Pepper Potts
                                    Don Cheadle         Col. James 

谢谢,

4

1 回答 1

1

您可以inner joinleft join像使用两个表一样:

select
  m.code, m.title, m.director,
  group_concat(p.name, '\n') as actors
from
  movies m
  left join data d on d.movie_code = m.code
  left join persons p on p.code = d.person_code
where
  m.code = 1

我选择left join这里,因为我认为没有演员也可以存在电影。也许您的信息仍然不完整,或者您还想存储纪录片。通过使用inner join,一部电影必须有演员才能出现在您的查询中。

假设它persons可能包含的不仅仅是演员,他们可能会有一个角色。由于一个人可以在一部电影中担任演员,而在导演另一部电影时,这个角色将在data.

你可以这样做:

select
  m.code, m.title,
  group_concat(case when d.role = 2 then p.name, '\n' end ) as directors,
  group_concat(case when d.role = 1 then p.name, '\n' end ) as actors
from
  movies m
  left join data d on d.movie_code = m.code
  left join persons p on p.code = d.person_code
where
  m.code = 1

这将使您有机会也将电影的导演(或多个导演)存储在个人中,而不仅仅是将他们的名字存储在电影中。

[编辑] 有趣的是,在您进行编辑之后,事实证明您已经有一个角色(模式)表,尽管您之前没有描述它。很令人困惑,但我想那秒查询可能对你有用。我让您将字段名称与您在编辑中指定的确切名称进行匹配。

于 2013-07-28T06:32:27.273 回答