sql嵌套查询与group by

时间:2015-11-01 21:51:15

标签: mysql sql group-by subquery

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

enter image description here

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

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函数存在于外部和内部查询中,是不是足够存在于内部查询中? 感谢。

3 个答案:

答案 0 :(得分:0)

第二个查询将产生错误,因为在Group by子句中不可能在select子句whitout中对列进行分组(除非它们受聚合影响)。
因此,您需要首先找到每个类别中的最高单价,然后找出哪个产品具有该不正确的价格。你可以通过很多方式实现这一目标。第一个查询就是其中之一。

答案 1 :(得分:0)

从你的图片来看,正如其他人提到你使用的是mysql,MYSQL优化器不太喜欢子查询,并且运行大量数据会很糟糕,最好的习惯是尽可能使用连接(如果你看看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

答案 2 :(得分:0)

SELECT p.*
FROM products p
WHERE NOT EXISTS ( SELECT 'p2'
                   FROM products p2
                   WHERE p2.categoryId = p.categoryId
                   AND p2.unitPrice > p.unitPrice
                  )