Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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语法查询_Mysql_Sql_Database - Fatal编程技术网

基于聚合的MySQL语法查询

基于聚合的MySQL语法查询,mysql,sql,database,Mysql,Sql,Database,我有一张名为TICKET的表格,上面有FLIGHTNUMBER和Insurated两列。被保险人只有0或1个值。FLIGHTNUMBER有重复项。我想得到保险中最大1个的航班号。以下是我尝试过的: SELECT FLIGHTNUMBER FROM (SELECT FLIGHTNUMBER,SUM(INSURED) AS INSURANCE_COUNT FROM TICKET GROUP BY TICKET.FLIGHTNUMBER) AS OUT2 WHERE O

我有一张名为TICKET的表格,上面有FLIGHTNUMBER和Insurated两列。被保险人只有0或1个值。FLIGHTNUMBER有重复项。我想得到保险中最大1个的航班号。以下是我尝试过的:

SELECT FLIGHTNUMBER 
FROM (SELECT FLIGHTNUMBER,SUM(INSURED) AS INSURANCE_COUNT 
      FROM TICKET 
      GROUP BY TICKET.FLIGHTNUMBER) AS OUT2 
WHERE OUT2.INSURANCE_COUNT = MAX(INSURANCE_COUNT) ;


但两者都在造成错误。你能告诉我正确的语法吗。提前感谢。

第一个不起作用,因为您不能在
WHERE
子句中使用聚合函数。只有在选择了所有行之后,才会发生聚合,并且使用
WHERE
选择行,因此存在鸡和蛋的问题

第二种方法不起作用,因为无法嵌套聚合函数

您不需要计算
MAX(保险计数)
。只需对查询进行排序,然后使用第一个查询

SELECT flightnumber
FROM (SELECT flightnumber, SUM(INSURED) AS insurance_count
      FROM ticket
      GROUP BY flightnumber) AS out2
ORDER BY insurance_count DESC
LIMIT 1
您甚至不需要在
SELECT
列表中使用
insurance\u count
,因此您不需要将其包装到子查询中即可将其删除

SELECT flightnumber
FROM ticket
GROUP BY flightnumber
ORDER BY SUM(insured) DESC
LIMIT 1
但是,如果有多个航班的最大航班数相同,则只返回其中一个航班。如果您需要获取所有这些数据,那么您需要编写一个子查询来获取最大值,并与之连接

SELECT flightnumber
FROM (SELECT flightnumber, SUM(insured) AS insurance_count
      FROM ticket
      GROUP BY flightnumber) AS out2
JOIN (SELECT SUM(insured) AS max_insurance_count
      FROM ticket
      GROUP BY flightnumber
      ORDER BY max_insurance_count DESC
      LIMIT 1) AS out3
ON out2.insurance_count = out3.max_insurance_count
你可以做:

SELECT flightnumber, SUM(insured) AS insured_count 
FROM ticket 
GROUP BY flightnumber 
ORDER BY insured_count DESC 
LIMIT 1;
这只是
投保
列上的
总和
聚合,按
航班号
分组,并按
投保计数
降序排序。我们只保留第一个结果

这并不考虑如果两个航班号码的投保金额相同,将会发生什么。您可以使用第二个
ORDER BY
字段打破联系,或者运行另一个外部查询


如果您有一个
flightnumber
表,您可以在每次修改
ticket
表时使用
SUM()
更新其
insured\u count
字段。如果您经常运行此报告,则效率会更高。
ticket
表以许多行结束,并且大多数行在航班完成后不会更改。

还值得注意的是,除非结果中存在保险计数问题,否则实际上不需要子查询<代码>按航班号按保险顺序分组\u count DESC LIMIT 1也可以。@ueerdo我做得更好。啊,是的,我忘记了聚合实际上不必在结果集中。如果有多个航班的最大值相同,您需要获得所有航班吗?
SELECT flightnumber, SUM(insured) AS insured_count 
FROM ticket 
GROUP BY flightnumber 
ORDER BY insured_count DESC 
LIMIT 1;