MySql 查询问题子句的意外排序。 (靠近位置 117 的“有”)[关闭]

分享于2022年07月17日 mysql syntax-error 问答
【问题标题】:MySql 查询问题子句的意外排序。 (靠近位置 117 的“有”)[关闭](MySql Query problem Unexpected ordering of clauses. (near "having" at position 117) [closed])
【发布时间】:2022-01-23 23:58:37
【问题描述】:

我必须为我的大学项目将所有 SQL 查询转换为 MySql,但我遇到了以下查询的问题:

select a.actor_name, count(fa.actor_id) as Movies
from Actor a
    join Film_Actor fa on a.actor_id = fa.actor_id
having count(fa.actor_id) = (select distinct max(count(actor_id)) from Film_Actor group by actor_id)
group by a.actor_name;

上面写着:

子句的意外排序。 (靠近位置 117 的“有”)

我确定我在 MySql 代码中存在语法问题(我们没有教过只有 MySql 的 Sql)

  • having group by 之后,而不是在它之前
  • 即使这样,有条件也会出错,子查询必须返回一个值。这应该只返回按计数降序排列的 1 行吗?
  • @Stu 是的,应该,但我认为 max() 将处理只返回一行。
  • 除非您在子查询中有一个 group by,因此它将为每个 actor_id 返回一行 - 您是否单独运行它?您不需要与 group by 不同,因为每一行已经是不同的;按计数递减限制 1 排序。
  • 查看原始查询和您尝试过的内容可能会有所帮助。也许你在交叉应用/横向或其他东西之后......查询试图做什么?返回最多电影中的演员?但是为什么在子查询中分组? ...那么您真正追求的是什么?)使用现有查询以及结果的最低限度完整的可验证示例数据;以及新系统中的预期结果。

【解决方案1】:

不能以这种方式嵌套聚合函数。试试这个:我们使用子查询,按计数排序,并将结果限制为只有 1 条记录,以获取演员参与的“最多”电影。

SELECT a.actor_name, count(fa.actor_id) as Movies
FROM Actor a
INNER JOIN  Film_Actor fa on a.actor_id = fa.actor_id
HAVING count(fa.actor_id) = (SELECT count(actor_id) 
                             FROM Film_Actor 
                             GROUP BY actor_id 
                             ORDER BY count(actor_id) DESC
                             LIMIT 1)
GROUP BYa.actor_name;

部分演示: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=c511932c7a16f8c9f5ecb85f03ee21cb