请让我知道下面的命令有什么问题
mysql> select max(count(*)) from emp1 group by name;
ERROR 1111 (HY000): Invalid use of group function
Run Code Online (Sandbox Code Playgroud)
从提供的代码中我了解到您希望选择具有相同名称的最多员工数.
您的查询的问题在于您尝试在单个范围中应用多个聚合级别.
试试这个:
SELECT MAX(Total) FROM (SELECT COUNT(*) AS Total FROM emp1 GROUP BY name) AS Results
Run Code Online (Sandbox Code Playgroud)
...或这个:
SELECT COUNT(name) FROM emp1 GROUP BY name ORDER BY COUNT(name) DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
两个查询都返回相同的结果,但它们的实现是不同的.
使用最适合您或您喜欢的任何一种.
你问的是“你的陈述有什么问题”。这是您的声明:
select max(count(*))
from emp1
group by name;
Run Code Online (Sandbox Code Playgroud)
我明白你的意思。但 SQL 编译器则不然。原因很简单。一个给定select只能有一个group by子句。您的查询要求其中两个。首先是group by名字。第二个是所有这些结果的汇总。
编写查询的正确方法(正如您所希望的那样)是使用子查询:
select max(cnt)
from (select count(*) as cnt
from emp1
group by name
) t
Run Code Online (Sandbox Code Playgroud)
这是一个完全合理的解决方案,仅使用标准 SQL。其他答案已经提出了使用该子句的解决方案limit,这可能会更有效一些。
我将执行以下操作(假设我正确理解您想要的内容):
select c from
(
select count(*) as c, name from emp1 group by name
) tmp
order by c desc limit 1
Run Code Online (Sandbox Code Playgroud)
这将按名称从所有计数中选择最大的计数。例如,如果您的表包含
Name
-----------------------
Test
Test
Hello
World
World
World
Run Code Online (Sandbox Code Playgroud)
内部选择将使用此数据创建一个“表”
c Name
----------------------
2 Test
1 Hello
3 World
Run Code Online (Sandbox Code Playgroud)
外部选择将按c降序排列并选择第一个条目,即3.
这可以缩短为
select count(*) c from emp1 group by name order by c desc limit 1
Run Code Online (Sandbox Code Playgroud)