Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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 使用GROUPBY的sql嵌套查询_Mysql_Sql_Group By_Subquery - Fatal编程技术网

Mysql 使用GROUPBY的sql嵌套查询

Mysql 使用GROUPBY的sql嵌套查询,mysql,sql,group-by,subquery,Mysql,Sql,Group By,Subquery,我正在阅读一些关于group by子句的教程,我遇到了以下问题,不知道为什么会这样解决,如下表所示: 要求是在每个类别中选择最昂贵的产品,下面的查询就是答案: SELECT categoryID, productID, productName, MAX(unitprice) FROM products A WHERE unitprice = ( SELECT MAX(unitprice) FROM products B WHERE

我正在阅读一些关于group by子句的教程,我遇到了以下问题,不知道为什么会这样解决,如下表所示:

要求是在每个类别中选择最昂贵的产品,下面的查询就是答案:

SELECT 
categoryID, productID, productName, MAX(unitprice)

FROM
products A

WHERE
unitprice = (

SELECT 
        MAX(unitprice)

    FROM
        products B

    WHERE
        B.categoryId = A.categoryID)

GROUP BY categoryID;
我不知道为什么上面的问题是答案,为什么不仅仅是:

SELECT 
categoryID, productID, productName, MAX(unitprice)

FROM
products 

GROUP BY categoryID;
另外,如果第一个查询是正确的,那么为什么
MAX
函数存在于外部查询和内部查询中,它不足以存在于内部查询中吗?
谢谢。

第二个查询将产生错误,因为在Group by子句中,select子句中的列不可能按它们分组(除非它们受聚合约束)。

因此,您需要首先找到每个类别中的最高单价,然后找到具有该单价的产品。实际上,您可以通过多种方式实现这一点。第一个查询就是其中之一

从您的图片上看,正如其他人提到的,您正在使用mysql,mysql Optimizer不太喜欢子查询,运行大量数据会很糟糕,最好的习惯是尽可能使用联接(如果您在postgres、oracle或mssql中查看查询计划,90%的时间会将子查询重新写入联接)

第二个查询将在默认mysql上运行,因为它将根据您错过的列进行分组

以下是一个例子:

SELECT 
A.categoryID, A.productID, A.productName, B.max_unitprice
FROM products A
JOIN (
SELECT 
max(unit price) as max_unitprice, 
categoryId
FROM products
GROUP BY categoryId) B
ON B.categoryId = A.categoryID

第二个查询仅聚合categoryid,因此结果集不提供列productid和productname。第一个查询在我所知道的任何数据库中都不起作用。您是偶然使用mysql的吗?请打开mysql中的严格分组模式。或者不要使用MySQL如果你不知道你不是SQL的高手,那是很危险的。
SELECT p.*
FROM products p
WHERE NOT EXISTS ( SELECT 'p2'
                   FROM products p2
                   WHERE p2.categoryId = p.categoryId
                   AND p2.unitPrice > p.unitPrice
                  )