在别名响应上应用WHERE条件的问题

时间:2009-11-06 10:06:46

标签: mysql

这让我疯了。我希望以前没有问过,但我找不到答案,所以我会尽力解释这种情况。

我的目标是根据品牌,类别,价格等一系列标准获取产品及其颜色版本的数据。

基本查询工作正常,因为它会根据需要返回所有数据。

作为功能要求,客户可以根据产品价格过滤结果。

产品的基本价格可以用颜色价格覆盖。例如,产品成本为69.99,但蓝绿色成本为39.99

产品表有一个包含价格的字段pPrice - 覆盖来自if语句:

if (pc.iColourPrice != 0, pc.iColourPrice, p.pPrice) as pPrice

但是,如果客户端应用价格过滤器,例如50到70,则会在查询结尾处附加:

and pPrice between 50 and 70 

不幸的是,这看起来像products.pPrice并通过iColourPrice忽略prodContainer表的覆盖。数据集的产品最终比请求的过滤器便宜。

问题是,如何应用将调整后的pPrice考虑在内的“where”过滤器?

3 个答案:

答案 0 :(得分:2)

您可以像这样编写过滤器:

and if(pc.iColourPrice != 0, pc.iColourPrice, p.pPrice) between 50 and 70

(别名不能在WHERE子句中使用:Problems with Column Aliases

答案 1 :(得分:0)

从if和in查询中重命名pPrice,写下新名称。

答案 2 :(得分:0)

使用HAVING而不是WHERE

SELECT if (pc.iColourPrice != 0, pc.iColourPrice, p.pPrice) as pPrice
FROM pc [+ JOINS]
WHERE [ + conditions]
HAVING pPrice BETWEEN 50 AND 70

在select之后和任何GROUP BY子句之后的某种意义上发生了,所以可以使用别名。