Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何进行SQL查询以查找聚合函数的最大值,如;计数;?_Mysql_Sql - Fatal编程技术网

Mysql 如何进行SQL查询以查找聚合函数的最大值,如;计数;?

Mysql 如何进行SQL查询以查找聚合函数的最大值,如;计数;?,mysql,sql,Mysql,Sql,这是我需要的英文查询: 显示动物id、名称和动物的检查次数,其中对动物进行的检查最多。 想想看,也许是第一。在这种情况下,所有拴在一起的动物都应该归还 以下是一些相关的SQL: select an_id, an_name, count(distinct ex_id) as NumberExams from vt_animals join vt_exam_headers using (an_id) 如果不使用desc和limit以及理想情况下使用groupby,我如何做到这一点?我曾想过使用ma

这是我需要的英文查询:

显示动物id、名称和动物的检查次数,其中对动物进行的检查最多。
想想看,也许是第一。在这种情况下,所有拴在一起的动物都应该归还

以下是一些相关的SQL:

select an_id, an_name, count(distinct ex_id) as NumberExams
from vt_animals
join vt_exam_headers using (an_id)

如果不使用
desc
limit
以及理想情况下使用
groupby
,我如何做到这一点?我曾想过使用
max
,但它似乎不适用于
count

您必须使用
group by
子句来处理聚合函数中未包含的列名

select an_id, an_name, count(distinct ex_id) as NumberExams
from vt_animals
group by an_id, an_name

必须对聚合函数中不包含的列名使用
group by
子句

select an_id, an_name, count(distinct ex_id) as NumberExams
from vt_animals
group by an_id, an_name

首先选择检查次数最多的动物:

SELECT an_id,count(ex_id) FROM animals GROUP BY an_id ORDER BY count(*) DESC LIMIT 1
SELECT a.an_id, a.an_name, a.number_exams
FROM (SELECT an_id, an_name, COUNT(ex_id) as number_exams
      FROM vt_animals
      JOIN vt_exam_headers USING (an_id)
      GROUP BY an_id) AS a
HAVING a.number_exams >= MAX(a.number_exams)
然后可以将其用作子查询


说明:您按计数(*)降序排列此表,然后选择最大值前1名。

首先选择检查次数最多的动物:

SELECT an_id,count(ex_id) FROM animals GROUP BY an_id ORDER BY count(*) DESC LIMIT 1
SELECT a.an_id, a.an_name, a.number_exams
FROM (SELECT an_id, an_name, COUNT(ex_id) as number_exams
      FROM vt_animals
      JOIN vt_exam_headers USING (an_id)
      GROUP BY an_id) AS a
HAVING a.number_exams >= MAX(a.number_exams)
然后可以将其用作子查询


说明:您按计数(*)降序排列此表,然后选择最大值top 1。

如果我很理解此查询,如果多个动物的检查次数最多,则类似的内容将返回动物组:

SELECT an_id,count(ex_id) FROM animals GROUP BY an_id ORDER BY count(*) DESC LIMIT 1
SELECT a.an_id, a.an_name, a.number_exams
FROM (SELECT an_id, an_name, COUNT(ex_id) as number_exams
      FROM vt_animals
      JOIN vt_exam_headers USING (an_id)
      GROUP BY an_id) AS a
HAVING a.number_exams >= MAX(a.number_exams)

如果我能很好地理解这个查询,如果不止一个动物的检查次数最多,那么类似这样的查询将返回该组动物:

SELECT an_id,count(ex_id) FROM animals GROUP BY an_id ORDER BY count(*) DESC LIMIT 1
SELECT a.an_id, a.an_name, a.number_exams
FROM (SELECT an_id, an_name, COUNT(ex_id) as number_exams
      FROM vt_animals
      JOIN vt_exam_headers USING (an_id)
      GROUP BY an_id) AS a
HAVING a.number_exams >= MAX(a.number_exams)

根据您正在使用的数据库产品的不同,其复杂性可能有所不同。例如,emibloque的答案在MS SQL Server中不起作用,因为having子句需要与group by子句相对应。在这种情况下,您必须按照以下思路进行操作:

select * from
(
    select an_name, count(*) exams
    from vt_animals a join vt_exam_headers e on a.an_id = e.an_id
    group by an_name
) sub1
where exams =
(
    select max(exams) from
    (
        select an_id, count(*) exams
        from vt_exam_headers
        group by an_id
    ) sub2
)
或者,如果您更喜欢使用变量:

declare @max_exams int;
select @max_exams = (
    select max(exams) from
    (
        select an_id, count(*) exams
        from vt_exam_headers
        group by an_id
    ) sub 
);
select * from
(
    select an_name, count(*) exams
    from vt_animals a join vt_exam_headers e on a.an_id = e.an_id
    group by an_name
) sub1
where exams = @max_exams

根据您正在使用的数据库产品的不同,其复杂性可能有所不同。例如,emibloque的答案在MS SQL Server中不起作用,因为having子句需要与group by子句相对应。在这种情况下,您必须按照以下思路进行操作:

select * from
(
    select an_name, count(*) exams
    from vt_animals a join vt_exam_headers e on a.an_id = e.an_id
    group by an_name
) sub1
where exams =
(
    select max(exams) from
    (
        select an_id, count(*) exams
        from vt_exam_headers
        group by an_id
    ) sub2
)
或者,如果您更喜欢使用变量:

declare @max_exams int;
select @max_exams = (
    select max(exams) from
    (
        select an_id, count(*) exams
        from vt_exam_headers
        group by an_id
    ) sub 
);
select * from
(
    select an_name, count(*) exams
    from vt_animals a join vt_exam_headers e on a.an_id = e.an_id
    group by an_name
) sub1
where exams = @max_exams

谁给你这个要求的?试一个小问题你在考试中得到了吗?只是一个家庭作业问题。我似乎在作业笔记中找不到类似的东西,所以我问了stackoverflow。我们正在学习“分组依据”和聚合函数,因此解决方案可能与此有关。您以前使用过子查询吗?谁给了您这个要求?试一个小问题你在考试中得到了吗?只是一个家庭作业问题。我似乎在作业笔记中找不到类似的东西,所以我问了stackoverflow。我们正在学习“分组依据”和聚合函数,因此解决方案可能与此有关。您以前使用过子查询吗?对,在我的测试查询中包括了它,但我忘了在这里重写。谢谢。是的,在我的测试查询中我包括了它,但是我忘了在这里重写。谢谢。我没有投票是因为你似乎没有读过这个问题。我没有投票是因为你似乎没有读过这个问题。