Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Php MYSQL中的按类别分组_Php_Mysql - Fatal编程技术网

Php MYSQL中的按类别分组

Php MYSQL中的按类别分组,php,mysql,Php,Mysql,我正在尝试解决如何从mySQL查询中每个类别只获得一个结果 我们有多个类别的大量产品,目标是获得每个类别节省最大产品的商品,但也不包括少数类别。这将产生一个简单的十大节约清单。到目前为止,我查询的SQL是: SELECT productName, productCategoryID, ((maxprice/minprice-1)*100) as PercentChange FROM products WHERE updatedDate > DATE_ADD(NOW

我正在尝试解决如何从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
查询给了我一个没有特定类别的前10名产品的列表,但其中有几个类别是重复的

有什么建议吗

谢谢


Rick

您可以使用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

假设您想要每个类别的顶级产品,那么在这种情况下,您需要按类别分组并使用聚合最大值

请注意,即使mysql允许包含未聚合的列以及类似bellow的聚合,结果也可能不是唯一的。例如,由于productName上缺少聚合/分组,MSSQL不允许这样的查询:

只有productCategoryID和PercentChange是可靠的

结果可能是

A | 1 | 50
C | 2 | 40
但由于productName上缺少聚合,也可能会出现以下结果:

A | 1 | 50
D | 2 | 40
它将为每个类别生成一个条目,但如果两行在分组方面相等,则最终结果不是100%可预测的,因此应采取另一种方法

例如,您还可以按名称分组,然后通过编程过滤掉不需要的结果:

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
与非分组查询相比,这至少可以消除每个名称和类别与MAXPercentChange不匹配的条目


注:如果您想更改最低价格,请使用MIN。我认为productName在查询中已经不同了。OP似乎希望每个类别最多有一种产品@Rick Evans?由于没有分组,可能存在一些重复,但你的建议很有趣。让我们看看OP是否给了我们一个明确的示例实际上是的,不同的是行。但是如果你能更好地解释添加一个示例,我可以试着改进我的答案只是尝试了一下,它确实重复了类别。这是在选择一个独特的产品名称吗?@RickEvans不,独特的产品对整行都有效。通过此查询,您将获得productName、category和percentchanged的唯一组合。可能会有两种来自同一类别的产品。对于查询的列,它仅排除与现有行在文字上重复的行。选择不同的firstname,lastname将返回John Smith和John AnotherSmith。选择不同的名字将只返回John。可能是的重复项
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