私はそのような単一の値に対してSQL LIKE%クエリを実行する方法を知っています:
SELECT * FROM users WHERE name LIKE %tom%;
しかし、私のLIKEの検索語が配列に由来する場合、どうすればよいですか?たとえば、次のような配列があるとします。
$words = array("Tom", "Smith", "Larry");
SQL LIKE%を実行して配列内の単語を検索するにはどうすればよいですか。
SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]%
クエリ全体をforeachループなどに入れずに
[〜#〜] edit [〜#〜]:CakePHPのfind( 'all')メソッドの条件内で、これをCakePHPで実行していることを忘れていたので、若干。
ありがとう
$sql = array('0'); // Stop errors when $words is empty
foreach($words as $Word){
$sql[] = 'name LIKE %'.$Word.'%'
}
$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
編集:CakePHPのコード:
foreach($words as $Word){
$sql[] = array('Model.name LIKE' => '%'.$Word.'%');
}
$this->Model->find('all', array(
'conditions' => array(
'OR' => $sql
)
));
これについて読んでください: http://book.cakephp.org/1.3/en/view/1030/Complex-Find-Conditions
標準SQLの場合は、次のようになります。
SELECT * FROM users WHERE name LIKE '%tom%'
OR name LIKE '%smith%'
OR name LIKE '%larry%';
MySQLを使用しているため、 RLIKE
(a.k.a. REGEXP
) を使用できます
SELECT * FROM users WHERE name RLIKE 'tom|smith|larry';
できません。連鎖する必要がありますfield like %..% or field like %..% or ...
。 A where ... in
句は、ワイルドカードをサポートせず、文字列の一致のみを抽出します。
[〜#〜] regexp [〜#〜] を使用してみてください
SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry';
ブロッククォート
/ ** *値の多次元配列を内包し、 "[]"ブロックと異なる場合に文字をグループ化します。 * @param array $ array分解する配列* @return string分解された配列*/function hoArray2SqlLike($ array){if(!is_array($ array))return $ array;
$values = array();
$strings = array();
foreach ( $array as $value )
{
foreach ( str_split( $value ) as $key => $char )
{
if ( ! is_array( $values[ $key ] ) )
{
if ( isset( $values[ $key ] ) )
{
if ( $values[ $key ] != $char )
{
$values[ $key ] = array( $values[ $key ] );
$values[ $key ][] = $char;
}
}
else
$values[ $key ] = $char;
}
elseif ( ! array_search( $char , $values[ $key ] ) )
$values[ $key ][] = $char;
}
}
foreach ( $values as $value )
{
if ( is_array( $value ) )
$value = '['.implode( '', $value ).']';
$strings[] = $value;
}
return implode( '', $strings );
}
このコードでは、SQLクエリで二重引用符を取得できません
$sql = array('0'); // Stop errors when $words is empty
foreach($words as $Word){
$sql[] = 'name LIKE %'.$Word.'%'
}
$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
SELECT * FROM person where name like %"Tom"% OR name like %"Smith"% OR name like %"Larry"%;
// error in double quotes and % is out side of Double quotes .
または、カンマ区切りの値を使用することもできます:-
$name = array(Tom, Smith, Larry);
$sql="SELECT * FROM person";
extract($_POST);
if ($name!=NULL){
$exp_arr= array_map('trim', explode(",",$name));
echo var_export($exp_arr);
//die;
foreach($exp_arr as $val){
$arr = "'%{$val}%'";
$new_arr[] = 'name like '.$arr;
}
$new_arr = implode(" OR ", $new_arr);
echo $sql.=" where ".$new_arr;
}
else {$sql.="";}
このようなSQLクエリをエコーします:-
SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%';
472084のコードを取得しました。
$sql = array('0'); // Stop errors when $words is empty
foreach($words as $Word){
$sql[] = 'name LIKE %'.$Word.'%'
}
$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
私にとっては、エラーSQLが返されたため、変更する必要がありました。スレッドを読む人のために投稿します。
foreach($words as $Word){
$sql[] = 'name LIKE \'%'.$Word.'%\'';
}
$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
それらの違いは引用についてです、私のmysql DBは問題があると言いました!だから私は$sql[] = 'name LIKE %'.$Word.'%'
からの引用をエスケープする必要があり、今では完全に動作しています。