我试图找出如何从mySQL查询中获得每个类别只有一个结果。
我们在多个类别中拥有大量产品,目的是为每个类别提供最大的产品节省,但也不包括几个类别。这应该会产生一个简单的十大储蓄清单。我到目前为止的查询的SQL是:
SELECT
productName,
productCategoryID,
((maxprice/minprice-1)*100) as PercentChange
FROM products WHERE updatedDate > DATE_ADD(NOW(), INTERVAL -1 DAY)
AND productCategoryID NOT IN (0,58,12,13)
AND (maxprice/minprice-1)*100) < '60'
ORDER BY PercentChange DESC LIMIT 10
该查询为我提供了一份没有特定类别的十大产品列表,但其中包含的几个类别是重复的。
任何指针?
谢谢,
瑞克
答案 0 :(得分:0)
您可以使用distinct来避免重复
SELECT DISTINCT
productName
,productCategoryID
,((maxprice/minprice-1)*100) as PercentChange
FROM products
WHERE updatedDate > DATE_ADD(NOW(), INTERVAL -1 DAY)
AND productCategoryID NOT IN (0,58,12,13)
AND (maxprice/minprice-1)*100)<'60'
ORDER BY PercentChange DESC LIMIT 10
答案 1 :(得分:-1)
假设您想要每个类别的“顶级”产品,您需要对类别进行分组并使用聚合(在这种情况下为Max)。
注意,即使mysql允许使用“unaggregated”列以及像bellow这样的聚合,结果也可能不是唯一的(例如MSSQL由于{{1}上缺少聚合/分组而不允许这样的查询}}):
productName
鉴于数据是(简化的)
SELECT
productName, -- unaggregated -> undetermined.
productCategoryID, -- grouping-condition -> fine
MAX((maxprice/minprice-1)*100) as PercentChange -- Aggregation -> fine
FROM products WHERE updatedDate > DATE_ADD(NOW(), INTERVAL -1 DAY)
AND productCategoryID NOT IN (0,58,12,13)
AND (maxprice/minprice-1)*100) < '60'
GROUP BY productCategoryID
ORDER BY PercentChange DESC LIMIT 10
只有productName | productCategoryID | PercentChange
A 1 50
B 1 10
C 2 40
D 2 40
和productCategoryID
可靠。
结果可能是
PercentChange
但由于A | 1 | 50
C | 2 | 40
上缺少聚合,因此可能会产生以下结果:
productName
它将为每个类别生成一个条目,但如果两行在“分组”方面相同,则最终结果不是100%可预测的,因此应采取另一种方法。
您可以 - 例如 - 按名称分组,然后以编程方式过滤掉不需要的结果:
A | 1 | 50
D | 2 | 40
会导致
SELECT
productName, -- grouping-condition -> fine
productCategoryID, -- grouping-condition -> fine
MAX((maxprice/minprice-1)*100) as PercentChange -- Aggregation -> fine
FROM products WHERE updatedDate > DATE_ADD(NOW(), INTERVAL -1 DAY)
AND productCategoryID NOT IN (0,58,12,13)
AND (maxprice/minprice-1)*100) < '60'
GROUP BY productName, productCategoryID
ORDER BY PercentChange DESC LIMIT 10
与“非分组”查询相比,这至少会消除与A | 1 | 50
C | 2 | 40
D | 2 | 40
不匹配的每个条目(每个名称和类别)。
ps。:如果您想要最低价格变动,请明显使用MAX(PercentChange)
。