如何从具有不同但有条件的字段的2个表中选择记录?

时间:2019-06-07 19:33:41

标签: mysql

我有2张桌子,一张保持电视显示“常规”信息,另一张保持情节/季节。我需要能够显示“常规”信息表中的所有记录,但要显示“情节”表中的一些数据。

表1(电视节目)结构:

id (int) | showname (varchar) | showcategory

表2(片段)的结构:

id (int) | tvshow (int) | episode (int) | season (int) | year(int) | poster(varchar)

示例:

电视节目:

1|The Big Bang Theory|150
2|Two and a half men|150
3|The Nanny|130

剧集:

1|1|1|1|2000|file1.jpg (The big bang theory, episode 1, season 1, year 2000)
2|1|1|2|2001|file2.jpg (The big bang theory, episode 1, season 2, year 2001)
3|2|5|4|2008|file3.jpg (Two and a half men, episode 5, season 4, year 2008)
4|2|6|4|2008|file4.jpg (Two and a half men, episode 6, season 4, year 2008)
5|3|1|1|1990|file5.jpg (The Nanny, episode 1, season 1, year 1990)

现在,我需要根据类别进行查询,并获取电视节目数据以及情节表中的一些数据。理想情况是:

如果category==150的结果将是:

The big bang theory (tvshows.showname) | 2 (count episodes.season) | 2000 (min episodes.year) | 2001 (max episodes.year) | file1.jpg (first poster found on episodes for this show)
Two and a half men (tvshows.showname) | 1 (count episodes.season) | 2008 (min episodes.year) | 2008 (max episodes.year) | file3.jpg (first poster found on episodes for this show)

如您所见,它们是按tvshows.showname排序的。

如果category==130的结果将是:

The Nanny (tvshows.showname) | 1 (count episodes.season) | 1990 (min episodes.year) | 1990 (max episodes.year) | file5.jpg (first poster found on episodes for this show)

现在,我设法通过执行多个查询来做到这一点,但是由于我们正在谈论巨大的表(这是一个IMDB风格的网站),要花一些时间才能显示出一些结果,这就是为什么我要进行优化查询。

1 个答案:

答案 0 :(得分:0)

您可以使用内部联接

  select tvshows.showname
    , count( distinct episodes.season)
    , min(episodes.year)
    , max(episodes.year)
    , min(episodes.filename)
  from tvshows 
  inner  join episodes on tvshows.id = episodes.twshows_id 
  where tvshows.category=150 
  group by  tvshows.showname

确保您在

上具有正确的综合索引

表电视节目列(类别,ID)

表格节目专栏twshows_id