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