PHP商品按价格排序时如何将零价格(询价)商品放在列表末尾
问题原因
之前的报错是因为旧代码中使用的isprice/price_param字段不属于当前查询的主表,Zend_Db_Table默认开启了SQL完整性校验,不允许直接使用关联表字段排序,所以抛出了跨表查询的错误。
正确实现代码
不需要额外依赖其他字段,直接用MySQL条件表达式实现零价格商品后置,修改排序逻辑如下:
$sort = $this->_getParam('sort'); $sort = $sort === 'ordr' ? '' : $sort; $sort_type = $this->_getParam('sort_type'); if ($sort) { if ($sort == 'price') { // 仅价格排序时加零价格后置逻辑 // 第一排序规则:非零价格优先,零价格靠后 $preOrder = 'CASE WHEN price = 0 THEN 1 ELSE 0 END ASC'; // 第二排序规则:按用户选择的价格升降序 $priceOrder = 'price ' . ($sort_type == 'desc' ? 'DESC' : 'ASC'); $products->setOrderField($preOrder . ', ' . $priceOrder); } else { // 其他排序字段走原有逻辑 $products->setOrderField($sort . ' ' . $sort_type); } }
逻辑说明
- 用
CASE WHEN price = 0 THEN 1 ELSE 0 END ASC作为第一排序条件:非零价格商品这个表达式返回0,零价格返回1,升序排列后所有非零商品都会排在零价格商品前面 - 第二排序条件保留原有的价格升降序逻辑,不影响正常价格商品的排序规则
- 所有字段都使用当前主表的
price字段,不会触发跨表查询的报错 - 如果你的零价格商品存储的是NULL而非0,把条件修改为
CASE WHEN price IS NULL THEN 1 ELSE 0 END ASC即可
内容的提问来源于stack exchange,提问作者maf
相关产品推荐
相关产品推荐

