我正在尝试获得具有倍数特定属性的产品。我的意思是说,我想搜索那些有"类型"=戒指和"金属"=黄金的产品
我尝试使用IN运算符,但它是OR运算的替代方法。我需要AND运算。
product_attribute表只有product_id,attribute_id,那么我如何在mysql 中执行和操作
opencart 1.5.4版
我已经尝试了下面的查询
SELECT * FROM oc_product_attribute WHERE product_id=42 AND attribute_id=15 AND attribute_id=17
输出为空
如果您希望在同一组中的属性之间具有OR逻辑,并且在不同组中的特性之间具有
and的逻辑,您应该:
-
转到"catalog''model''catalog"编辑产品.php
-
您需要编辑的功能是
public function getProducts($data = array(), $get_all = FALSE) {
-
在函数开始时指定以下变量:
$validimi = false; $filter_groups = array();
-
查找此代码:
if (!empty($data['filter_filter'])) { $implode = array(); $filters = explode(',', $data['filter_filter']); foreach ($filters as $filter_id) { $implode[] = (int)$filter_id; } $sql .= " AND pf.filter_id IN (" . implode(',', $implode) . ")";
}
-
并在
$sql .= " AND pf.filter_id IN (" . implode(',', $implode) . ")";
之前添加此片段$sql_check = "SELECT DISTINCT (filter_group_id) FROM " . DB_PREFIX . "filter WHERE filter_id IN (" . implode(',', $implode) . ") "; $query_check = $this->db->query($sql_check); $filter_groups = array(); foreach ($query_check->rows as $result) { $filter_groups[$result['filter_group_id']] = array(); } if(count($filter_groups) > 1){ $validimi = true; }else{ $validimi = false; }
-
最后在我指定的函数中找到这段代码:
$sql.="GROUP BY p.product_id";
-
并将其更改为:
If( $validimi ) {
$sql.="GROUP BY p.product_id HAVING COUNT(DISTINCT pf.filter_id)=".COUNT($filter_groups);
}else{ $sql .= " GROUP BY p.product_id"; }
现在试试你的过滤器,它们应该可以正常工作,这是我在自己的商店中创建和使用的,但使用了opencart 1.5.5.1版本,但我认为它在你的情况下也会正常工作。逻辑很清楚,所以如果这段代码对您没有帮助,您可以使用该逻辑创建自己的:)。
希望我能帮上忙。