我有以下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个匹配(唯一)样式,但优先选择那些符合此款式且有折扣的商品。
答案 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