0

私のDBにはたくさんの製品があります。私の製品テーブルには、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 のOperator Precedenceについて読んでください(基本的にすべての RDBMS に適用されます)。

于 2013-01-24T01:22:57.020 に答える