【问题标题】:Query for find the decade with the largest number of records查询查找记录数最多的十年
【发布时间】:2018-07-31 08:52:28
【问题描述】:

我有一个包含以下表格的数据库:

ACTOR (id, fname, lname, gender)
MOVIE (id, name, year, rank)
DIRECTOR (id, fname, lname)
CAST (a_id, m_id, role)
MOVIE_DIRECTOR (d_id, m_id)

现在我要检索以下问题的数据。

十年是连续 10 年的序列。例如,1965、1966、...、1974 是十年,1967、1968、...、1976 年也是如此。找出电影数量最多的十年

【问题讨论】:

  • 家庭作业?你试过什么?
  • 提示:每部电影都可以看作是十年的开始。那么,十年就是这部电影的年份和电影的年份+10之间的所有年份。
  • 你可以在这个链接stackoverflow.com/questions/27338110/…找到你的答案
  • @HeshamGomaa 该答案解决方案的要求与此不同。他正在寻找可以从任何一年开始的几十年。不仅是一年的模数 10 = 0
  • 注意你应该使用self join

标签: mysql sql


【解决方案1】:

我会通过生成年份、加入电影然后聚合来做到这一点:

select y.year as decade_start, y.year + 9 as decade_end,
       count(*) as num_movies
from (select distinct year from movies) y join
     movies m
     on m.year >= y.year and m.year < y.year + 10
group by y.year
order by count(*) desc
limit 1;

【讨论】:

    【解决方案2】:

    这里似乎只有 MOVIE 表很重要才能得到这个答案。

    在 MySql 8.x 中,可以为此在 CTE 上使用自联接。

    WITH MOV AS
    (
       SELECT year as movie_year, COUNT(id) as total_movies
       FROM MOVIE 
       GROUP BY year
    )
    SELECT
      m1.movie_year as decade_start,
      MAX(m2.movie_year) as decade_end,
      SUM(m2.total_movies) as total_movies
    FROM MOV m1
    LEFT JOIN MOV m2 ON (m2.movie_year BETWEEN m1.movie_year AND m1.movie_year + 9)
    GROUP BY m1.movie_year
    ORDER BY SUM(m2.total_movies) DESC
    LIMIT 1
    

    在不支持 CTE 的 MySql 5.x 中,只需将 m1 和 m2 的 MOV 替换为来自 CTE 的查询的子查询。

    【讨论】:

    • @JimmyB,我的高尔夫编码直觉同意你的看法。当然,如果您打开这是 5.x 的解决方案。但我认为如果你只加入几年到十年,而不是将一年中的所有电影加入十年中的所有电影,性能会更好。不知道 HAVING 对此有何帮助?
    • @FatemaT.Zuhora 太酷了。好吧,我猜您仍在使用旧的 MySql 5.x,并且必须从 WITH 更改?顺便说一句,与 8.x 相比,5.x 缺少很多好的 SQL 内容。我没有一张包含很多电影的表格来进行性能比较。我很想了解所有解决方案的速度比较。
    • 是的,我使用的是 5.6.x
    【解决方案3】:

    你尝试过这样的事情吗?

    select
      m.year as decade_begin,
      count(rollup.id) as movies_count
    from
      MOVIE m,
      MOVIE rollup
    where
      rollup.year >= decade_begin and rollup.year < decade_begin+10
    group by
      decade_begin
    order by
      movies_count;
    

    【讨论】:

    • distinct 应该被删除。
    • 唯一仍然缺少的是提取最大movies_count 的记录。最简单的(MySQL)方式:ORDER BY movies_count DESC LIMIT 1.
    • @LostReality 我正在使用 MySQL 5.6.x & 无法获得 rollup 是什么以及为什么使用它
    • 'm' 和 'rollup' 只是表别名
    • 这基本上只是一个自动加入。 m 用于获取每一行,rollup 用于计算我们关联的聚合值
    猜你喜欢
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2012-11-30
    • 2013-09-12
    相关资源
    最近更新 更多