2013-04-16 29 views
10

私はコンマで区切られたキーワードを含む文字列を持っています。たとえば、次のようにMySQLとPHP:複数のキーワード検索

$keywords = 'keyword1, keyword2, keyword3'; 

tbl_addressという名前の私のテーブルのスキーマは、この(簡体字)のようなものです:

id  INT(11)  PRIMARY KEY, AUTO INCREMENT 
address VARCHAR(250) NOT NULL 

は、私はPHP(ないPDO)でMySQLiを使用する必要がありますと仮定します。

$result = array(); 
$keyword_tokens = explode(',', $keywords); 
foreach($keyword_tokens as $keyword) { 
    $keyword = mysqli_real_escape_string(trim($keyword)); 
    $sql = "SELECT * FROM tbl_address WHERE address LIKE'%$keyword%'"; 
    // query and collect the result to $result 
    // before inserting to $result, check if the id exists in $result. 
    // if yes, skip. 
} 
return $result; 

このアプローチは動作しますが、パフォーマンスの非効率的な:

は、ここに私の現在のアプローチです。たくさんのキーワードがある場合、それは多くのクエリを行います。

私の質問は、同じ目標を達成するためのより良い方法はありますか?つまり、キーワードのANYを含むアドレスを持つすべてのレコードを返す最も簡単な方法は何ですか?

+0

これはあなたを助けることができます:http:// stackoverflow。COM// 9736386/1983854 – fedorqui

+0

組み合わせる「LIKE」と「IN」:「http://stackoverflow.com/questions/1865353/combining-like-and-in-for-sql-server – Chris

+2

@Shivian真剣に、なぜのdidn REGEXP one-linerを使用していますか? – Jimbo

答えて

17

シンプルREGEXPはあなたが後にしているものかもしれません。それがあなた自身のためにいかに効率的であるかをチェックしなければならないでしょう。

SELECT * FROM tbl_address WHERE field REGEXP 'keyword1|keyword2|keyword3';

+1

+1これはまさに私が探していたもので、私は新しい 'MySQL'文字列関数も学びました! –

+1

優秀な答えは、これは私の研究の数週間の価値を解決するのに役立ち、私の問題の30%以上を飛び越えるのを助けた:) – Birdy

0

フルテキスト検索を使用することをお勧めします。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

あなたが使用したり、WHERE条件でできるフルテキストを使用したくない場合は、単に検索文字列WHERE句を作成し、照会し、それを追加している

SELECT * FROM tbl_address WHERE address LIKE '%$keyword%' OR adress LIKE '%$keyword2%' 
5
SELECT * FROM user; 
+---------+----------+ 
| user_id | username | 
+---------+----------+ 
|  101 | Adam  | 
|  102 | Ben  | 
|  103 | Charlie | 
|  104 | Dave  | 
+---------+----------+ 

SELECT * 
    FROM user 
    WHERE FIND_IN_SET(username,'adam,ben,dave') > 0; 
+---------+----------+ 
| user_id | username | 
+---------+----------+ 
|  101 | Adam  | 
|  102 | Ben  | 
|  104 | Dave  | 
+---------+----------+ 
+0

このアプローチのちょっとした警告です。 LIKE構文を使用することはできませんし、キーワードをトリミングしません... – arraintxo

0

ベストな方法一度実行してください。

$result = array(); 
$keyword_tokens = explode(',', $keywords); 
$where = '';$i=0 
foreach($keyword_tokens as $keyword) { 
    $where.= " address LIKE'%".mysqli_real_escape_string(trim($keyword))."%' OR "; 
} 
    // trim last OR with substr_replace 
    substr_replace($where, "OR", -1, 1); 
    $sql = "SELECT * FROM tbl_address WHERE $where"; 

return $result; 
0

こんにちは、ここでクエリを実行し、ループの終わりに

$result = array(); 
$keyword_tokens = explode(',', $keywords); 
$sql = ''; 
foreach($keyword_tokens as $keyword) { 
    $keyword = mysqli_real_escape_string(trim($keyword)); 
    if (!empty($sql)) $sql .= " UNION "; 
    $sql .= "SELECT * FROM tbl_address WHERE address LIKE'%$keyword%'"; 
    // query and collect the result to $result 
    // before inserting to $result, check if the id exists in $result. 
    // if yes, skip. 
} 

を組合とクエリを作成して実行します。

3

あなたが唯一何も...

<?php 

$result = array(); 
$keyword_tokens = explode(',', $keywords); 
$keyword_tokens = array_map('mysqli_real_escape_string', $keyword_tokens); 

$sql = "SELECT * FROM tbl_address WHERE address LIKE'%"; 
$sql .= implode("%' or address LIKE '%", $keyword_tokens) . "'"; 

// query and collect the result to $result 
// before inserting to $result, check if the id exists in $result. 
// if yes, skip. 

return $result; 

編集、 'OR' を必要とする:ちょうどあなたもまた、キーワード

<?php 

$result = array(); 
$keyword_tokens = explode(',', $keywords); 
$keyword_tokens = array_map(
    function($keyword) { 
     return mysqli_real_escape_string(trim($keyword)); 
    }, 
    $keyword_tokens 
); 

$sql = "SELECT * FROM tbl_address WHERE address LIKE'%"; 
$sql .= implode("%' OR address LIKE '%", $keyword_tokens) . "'"; 

// query and collect the result to $result 
// before inserting to $result, check if the id exists in $result. 
// if yes, skip. 

return $result; 

をトリミング確かに、あなたも渡す必要がありますmysqli_real_escape_string()関数へのdbリソースリンク...

+0

あなたは '$ sql'の後ろに一重引用符を見逃しました。 – Raptor

+1

あなたは正しいです。 Allready added too :) – arraintxo

+0

これは機能しません。それは私にSQLエラーがあると言います。 – Eenvincible

1

単一クエリを作成

$keywordary = explode(',', $keywords); 
foreach($keywordary as $keyword) { 
    $keys = trim($keyword); 
    $other .=" or address like '%$keys%'"; 
} 
$sql = "SELECT * FROM tbl_address WHERE address LIKE'%$keyword%' $other"; 

execute query; 
return $result; 
+1

これはあなたのループの中で '$ other =" 'の代わりに' $ other。= "'ではないでしょうか?それ以外の場合は、各ループで 'または'句を取り消します。 – TheCarver

1

IN句試してみてください。

$keyword = (array)explode(',', $keywords); 
for($i=0;$i=count($keyword);$i++){ 
    $keyword[$i]=mysqli_real_escape_string(trim($keyword[$i]),'\'" '); 
} 
//This is what I suggest. 
$query='SELECT * FROM tbl_address WHERE address IN ("'.implode('","',$keyword).'")'; 

に成功のMySQL 5.1でテスト。

関連する問題