我正在使用一张表格,其中包含一个小型定制电子商务网站上的各种库存商品。我的客户要求提供多种过滤器,包括价格范围。
除了根据用户帐户中的各种因素,还需要依赖于用户的定价,因此很容易,因此价格会在查询中计算出来。
理想的SQL是这样的:
SELECT
SQL_CALC_FOUND_ROWS s.*,
IF(s.value_a <= 0.5, s.price*1.1*0.80, s.price*1.5*0.80) AS total_price
FROM stock s
WHERE
(total_price >= :minimum_price_filter AND total_price <= :maximum_price_filter)
AND (s.value_b='X' OR s.value_b='Y')
ORDER BY total_price ASC, s.value_a, s.value_b LIMIT 0,25
(1.1*0.80
和1.5*0.80
是四个与用户相关的值。)
显然SELECT
计算工作正常,ORDER
和WHERE
表格中的其他值也是如此:但现在添加此价格过滤器不起作用该价格字段(total_price
)及其值在查询中动态生成。
关于如何将价格范围过滤器添加到WHERE
子句中的任何提示或提示实际上都是可能的吗?
WHERE (total_price >= :minimum_price_filter AND total_price <= :maximum_price_filter)
如果它与如何处理问题有任何不同,我正在使用PHP和PDO。
感谢您的时间。
答案 0 :(得分:1)
使用HAVING
:
HAVING子句已添加到SQL,因为WHERE关键字不能与聚合函数一起使用
SELECT
SQL_CALC_FOUND_ROWS s.*,
IF(s.value_a <= 0.5, s.price*1.1*0.80, s.price*1.5*0.80) AS total_price
FROM
stock s
WHERE
s.value_b='X'
OR s.value_b='Y'
HAVING
total_price <= :maximum_price_filter
AND total_price >= :minimum_price_filter
ORDER BY
total_price ASC,
s.value_a, s.value_b
LIMIT
0,25
此查询应该可以胜任。