问题描述
||
我有以下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