【问题标题】:Return the company with most film in a genre归类电影最多的公司
【发布时间】:2020-06-22 04:34:29
【问题描述】:

我正在我的大学从事这个项目,我需要在其中创建对数据库的查询。我希望查询返回给定类型中拥有最多电影的公司。目前我有这个查询,但这只返回一家公司,但可能不止一家。

SELECT CompanyID, CategoryID, COUNT(*) as NumberOfMovies
FROM Movie
    NATURAL JOIN CategoryFilm
    NATURAL JOIN Category
    NATUAL JOIN Comapny
    GROUP BY CategoryID, CompanyID
    Order by NumberOfMovies DESC LIMIT 1

我相信我在这里需要一个“拥有”。

【问题讨论】:

  • 所以你有一些数据,当你对这些数据运行这个 select 语句时,你会得到一行并且你期望不止一个?您是否认为我们应该拥有该数据的一部分以便我们可以尝试帮助您?请使用这些数据添加您的预期结果并与我们分享您使用什么数据库?
  • @Jonas,请检查是否有帮助

标签: mysql sql sql-order-by inner-join window-functions


【解决方案1】:

请试试这个,可能是因为你添加了limit 1,它只显示第一条检索到的记录

SELECT CompanyID, CategoryID, COUNT(*) as NumberOfMovies
FROM Movie
    NATURAL JOIN CategoryFilm
    NATURAL JOIN Category
    NATURAL JOIN Comapny
    GROUP BY CategoryID, CompanyID
    Order by NumberOfMovies DESC 

【讨论】:

    【解决方案2】:

    我假设“类别”是指“类型”——或者它们是同一个东西。

    不要使用NATURAL JOIN。它甚至不使用正确声明的外键关系,而是仅依赖表之间的名称相似性。这是危险的,因为未指定使用的列,并且可能会引入难以调试的错误。我经常将其称为“可憎”,因为它没有考虑表声明。

    如果你有一个给定的类别,那么我希望有一个WHERE 子句:

    SELECT CompanyID, COUNT(*) as NumberOfMovies
    FROM Movie m JOIN
         CategoryFilm cf
         ON cf.movie_id = m.movie_id JOIN
         Company c
         ON c.company_id = m.company_id
    WHERE cf.category_id = ?
    GROUP BY CategoryID
    ORDER BY NumberOfMovies DESC
    LIMIT 1;
    

    【讨论】:

      【解决方案3】:

      如果要允许平局,可以使用窗口函数rank()

      select *
      from (
          select 
              co.companyID,
              ca.categoryID,
              count(*) NumberOfMovies,
              rank() over(partition by c.categoryID order by count(*) desc) rn
          from movie m
          inner join categoryFilm cf on cf.movieID = m.movieID
          inner join category ca     on ca.categoryID = cf.categoryID
          inner join company co      on co.companyID = m.companyID
          group by co.companyID, ca.categoryID
      ) t
      where rn = 1
      order by ca.categoryID
      

      这将为您提供每个类别的顶级公司,包括关系。如果要过滤给定的类别,只需在内部查询中添加 where 子句即可。

      旁注:不要使用natural joins:它们容易出错。我重写了查询以改用inner joins(我对关系做了一些假设)。

      【讨论】:

        猜你喜欢
        • 2016-06-17
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        相关资源
        最近更新 更多