我正在尝试获得具有倍数特定属性的产品。 我的意思是说,我想搜索那些有"类型" =戒指和"金属" =黄金
的产品我尝试使用 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
输出为空白
答案 0 :(得分:0)
如果您希望在同一组中的属性之间具有 OR 逻辑,并且在不同组中的属性之间具有 AND 逻辑,则应该:
转到“catalog \ model \ catalog”编辑product.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,但我认为它也适用于你的情况。逻辑很清楚,以防这段代码对你有帮助,你可以使用逻辑创建自己的代码:)。
希望我帮助过。