php - wildcards - sql start with
SQL LIKE% dentro de la matriz (7)
Sé cómo realizar una consulta SQL LIKE% para un solo valor así:
SELECT * FROM users WHERE name LIKE %tom%;
pero, ¿cómo hago esto si los términos de búsqueda para mi LIKE provienen de una matriz? Por ejemplo, digamos que tenemos una matriz como esta:
$words = array("Tom", "Smith", "Larry");
¿Cómo realizo mi SQL LIKE% para buscar las palabras en mi matriz como:
SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]%
SIN poner toda la consulta dentro de un bucle foreach o algo
EDITAR : Olvidé mencionar que estoy haciendo esto en cakePHP dentro de las condiciones del método de descubrimiento de CakePHP (''todo''), por lo que eso complica un poco las cosas.
Gracias
Blockquote
/ ** * Implode una matriz de valores multidimensional, agrupando caracteres cuando son diferentes con el bloque "[]". * @param array $ array La matriz a implosionar * @return string La matriz implosionada * / 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 );
}
Acabo de tomar el código de 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);
Por mi parte, tuve que modificarlo porque me ha devuelto un error SQL. Lo publico para la gente que va a leer el hilo.
foreach($words as $word){
$sql[] = ''name LIKE /'%''.$word.''%/''';
}
$sql = ''SELECT * FROM users WHERE ''.implode(" OR ", $sql);
La diferencia entre ellos es acerca de la cita, ¡my myqq DB dijo que hay un problema! así que tuve que escapar de la cita de $sql[] = ''name LIKE %''.$word.''%''
y ahora funciona perfectamente.
En el caso de SQL estándar, sería:
SELECT * FROM users WHERE name LIKE ''%tom%''
OR name LIKE ''%smith%''
OR name LIKE ''%larry%'';
Ya que estás usando MySQL puedes usar RLIKE
(también conocido como REGEXP
)
SELECT * FROM users WHERE name RLIKE ''tom|smith|larry'';
En este código no podemos obtener comillas dobles en consultas 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 .
O también puedes usar un valor separado por comas:
$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.="";}
Echo sql consulta de esta manera: -
SELECT * FROM person where name like ''%Tom%'' OR name like ''%Smith%'' OR name like ''%Larry%'';
Usted no puede Tendrá que ser un field like %..% or field like %..% or ...
encadenado field like %..% or field like %..% or ...
A where ... in
cláusula solo extrae coincidencias de cadena, sin soporte para comodines.
intenta usar REGEXP
SELECT * FROM users where fieldName REGEXP ''Tom|Smith|Larry'';
$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);
Edición: código para CakePHP:
foreach($words as $word){
$sql[] = array(''Model.name LIKE'' => ''%''.$word.''%'');
}
$this->Model->find(''all'', array(
''conditions'' => array(
''OR'' => $sql
)
));
Lea sobre esto: http://book.cakephp.org/1.3/en/view/1030/Complex-Find-Conditions