在MYSQL中按类别分组

时间:2017-02-27 15:43:45

标签: php mysql

我试图找出如何从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

该查询为我提供了一份没有特定类别的十大产品列表,但其中包含的几个类别是重复的。

任何指针?

谢谢,

瑞克

2 个答案:

答案 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)