在我的数据库中,我有一堆产品。在我的产品表中,我有一个名为active
的列,默认为1
(这意味着它处于“活动状态”)当我删除产品而不是删除行时,我只需将活动列更改为{{1 }}
我还有一个搜索功能,可以按名称或描述等搜索产品。我使用codeigniter作为框架。这是我生成查询的代码:
0
此代码生成此mysql查询:
$search_query = $this->db->from('company_products')
->where('company_products.active', 1)
->or_like(array('name'=> $keywords, 'model'=> $keywords, 'brand'=> $keywords, 'description'=> $keywords))
->order_by('id', 'RANDOM')
->get();
在“删除”产品后(将活动列更改为0),产品仍会显示在搜索结果中。这是我怀疑在代码上发生的事情:
SELECT `company_products`.*
FROM (`company_products`)
WHERE `company_products`.`active` = 1
AND `name` LIKE '%chair%'
OR `model` LIKE '%chair%'
OR `brand` LIKE '%chair%'
OR `description` LIKE '%chair%'
但这就是我想要的:
(SELECT a product WHERE active = 1 - AND - name LIKE %search_string%)
- OR -
(SELECT a product WHERE model LIKE %search_string%)
- OR -
(SELECT a product WHERE brand LIKE %search_string%)
- OR -
(SELECT a product WHERE description LIKE %search_string%)
我希望我的伪代码不会太混乱。我想使用codeigniter的活动记录类来完成此任务。
答案 0 :(得分:1)
活动记录本身不会这样做,你需要对那些或那些进行分组,否则它们将作为一个或整个查询的一部分工作。您需要手动在复杂查询中构建WHERE语句,在这些情况下,我根本不打扰活动记录,但如果您真的想要使用它,您可以这样做:
$where = "`company_products`.`active` = 1 AND (`name` LIKE '%$keywords%'
OR `model` LIKE '%$keywords%' OR `brand` LIKE '%$keywords%' OR
`description` LIKE '%$keywords%')";
$search_query = $this->db->from('company_products')
->where($where)
->order_by('id', 'RANDOM')
->get();
答案 1 :(得分:0)
使用括号:
SELECT `company_products`.*
FROM (`company_products`)
WHERE `company_products`.`active` = 1
AND (`name` LIKE '%chair%'
OR `model` LIKE '%chair%'
OR `brand` LIKE '%chair%'
OR `description` LIKE '%chair%')
阅读MySQL中的Operator Precedence(基本上它适用于所有RDBMS)