0

在我的数据库中,我有一堆产品。在我的产品表中,我有一个名为的列active,默认为1(这意味着它是“活动的”)当我删除产品而不是删除行时,我只是将活动列更改为0

我还有一个搜索功能,可以按名称或描述等搜索产品。我使用 codeigniter 作为框架。这是我生成查询的代码:

$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();

此代码生成此 mysql 查询:

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%'

在“删除”产品(将活动列更改为 0)后,该产品仍会显示在搜索结果中。这就是我怀疑在代码上发生的事情:

(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%)

但这就是我想要的:

(SELECT a product WHERE active = 1) 

 - AND - 

{ (SELECT a product WHERE model 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 的活动记录类来完成这项工作。

4

2 回答 2

1

活动记录不会单独执行此操作,您需要将它们分组,否则它们将作为或针对查询的整个 where 部分工作。您需要在复杂查询中手动构建 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();
于 2013-01-24T03:22:10.557 回答
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 中的运算符优先级(基本上它适用于所有 RDBMS)

于 2013-01-24T01:22:57.020 回答