Mysql 返回一个类型的大多数电影的公司

Mysql 返回一个类型的大多数电影的公司,mysql,sql,sql-order-by,inner-join,window-functions,Mysql,Sql,Sql Order By,Inner Join,Window Functions,我在我的大学里从事这个项目,在那里我需要创建一个数据库查询。我希望查询返回给定类型中大多数电影的公司。目前我有这个查询,但它只返回一个公司,但可能有多个 SELECT CompanyID, CategoryID, COUNT(*) as NumberOfMovies FROM Movie NATURAL JOIN CategoryFilm NATURAL JOIN Category NATUAL JOIN Comapny GROUP BY CategoryID,

我在我的大学里从事这个项目,在那里我需要创建一个数据库查询。我希望查询返回给定类型中大多数电影的公司。目前我有这个查询,但它只返回一个公司,但可能有多个

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

我想我需要一个“have”在这里。

请尝试一下,这可能是因为您添加了
限制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 

请尝试此操作,可能是因为您添加了
限制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 
我假设“类别”是指“类型”——或者它们是同一个东西

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

如果您有一个给定的类别,那么我希望有一个
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;
我假设“类别”是指“类型”——或者它们是同一个东西

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

如果您有一个给定的类别,那么我希望有一个
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;

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

这将为您提供每个类别的顶级公司,包括领带。如果要对给定类别进行筛选,只需在内部查询中添加一个
where
子句即可


旁注:不要使用
natural join
s:它们容易出错。我重新编写了查询,改为使用
内部联接
s(我对关系做了一些假设)。

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

这将为您提供每个类别的顶级公司,包括领带。如果要对给定类别进行筛选,只需在内部查询中添加一个
where
子句即可


旁注:不要使用
natural join
s:它们容易出错。我重写了查询,改为使用
内部联接
s(我对关系做了一些假设)。

因此您有一些数据,当您对该数据运行此select语句时,您返回了一行,并且希望返回多行?你认为我们应该有一部分数据,这样我们才能帮助你吗?请用这些数据添加您的预期结果,并与我们共享您使用的数据库?@Jonas,请检查它是否有助于您获得一些数据,当您对这些数据运行此select语句时,您会返回一行,并且您预期会有多行?你认为我们应该有一部分数据,这样我们才能帮助你吗?请用这些数据添加您的预期结果,并与我们分享您使用的数据库?@Jonas,请检查是否有用