我正在阅读一些关于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
函数存在于外部和内部查询中,是不是足够存在于内部查询中?
感谢。
答案 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
)