如何在“ GROUP BY”语句上施加条件-MySQL

问题描述

|| 我有以下MySQL查询
SELECT * 
  FROM products
 WHERE catalog = 1
 GROUP BY style
 ORDER BY name ASC
 limit 0,100
由于我有多个具有相同“样式”的产品,因此这将返回有关具有特定“样式”的第一个产品的信息(通过GROUP BY条件)。 因为某些产品具有“折扣”,所以我的问题如下:如何使“按样式分组”条件优先考虑具有折扣的产品?我的最终目标是使用1个查询,而不是之后查询每种返回的样式并检查是否有折扣商品 如果我指定“ GROUP BY样式,折扣”,它将返回2个具有相同样式的产品:1个带有折扣,1个没有折扣。这不是我需要的东西-我只需要返回1个匹配(唯一)样式,但优先选择那些具有此折扣的匹配该样式的项目。     

解决方法

您不能在单个查询的分组集中强加优先级。您可以在应用GROUP BY之前通过使用WHERE来限制结果,但这只会剥离不满足WHERE条件的行的结果。要在分组集中查找订单,请使用如下查询:(假设id是此处的主键)
SELECT p.* FROM
  ( SELECT style,max(discount) as highest_discount 
    FROM products
    WHERE catalog = 1
    GROUP BY style ) p1
JOIN products p
ON p.id =
  ( SELECT pu.id 
    FROM products pu
    WHERE pu.catalog = 1
      AND pu.style = p1.style
      AND pu.discount = p1.highest_discount
    LIMIT 1 )
    ,看看\“ HAVING \”子句。它应该使您靠近。 http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html     ,当您说“具有折扣的产品优先”时,优先意味着订购而不是分组。您需要按ѭ2排序结果(我假设这是一列,而不是表格)。     ,我认为可以通过
HAVING
子句来完成;假设折扣表为布尔值,则1为折扣,0为无折扣:
SELECT * 
FROM 
  products 
WHERE 
  catalog = 1 
GROUP BY 
  style 
HAVING
  discount = MAX(discount)
ORDER BY 
  name ASC limit 0,100
编辑:我可能已经读错了问题。如果您想要的是折扣最显眼的商品,则只需更改
ORDER BY
子句:
SELECT * 
FROM 
  products 
WHERE 
  catalog = 1 
GROUP BY 
  style 
ORDER BY 
  discount DESC,name ASC 
LIMIT 
  0,100