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

时间:2011-04-29 17:39:09

标签: mysql

我有以下MySQL查询:

SELECT * 
  FROM products
 WHERE catalog = 1
 GROUP BY style
 ORDER BY name ASC
 limit 0, 100

由于我有多个产品具有相同的“样式”,因此这将返回有关具有特定“样式”的第一个产品的任何信息(通过GROUP BY条件)。

由于某些产品有“折扣”,我的问题如下如何制作,以便“GROUP BY样式”条件优先考虑具有折扣?我的最终目标是使用1个查询而不是之后通过每个返回的样式并检查是否有任何带折扣的产品

如果我指定“GROUP BY样式,折扣”,则返回2个具有相同样式的产品:1个带有1个没有折扣的产品。这不是我需要的东西 - 我只需要返回1个匹配(唯一)样式,但优先选择那些符合此款式且有折扣的商品。

4 个答案:

答案 0 :(得分:1)

看看“HAVING”条款。它应该让你更接近。 http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

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

答案 2 :(得分:0)

当您说“具有折扣的产品的优先级”时,优先级意味着订购,而不是分组。您需要按discount订购结果(我假设它是一列,而不是表格。)

答案 3 :(得分:0)

我认为这可以通过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