with wildcards values start number not multiple example characters php mysql sql sql-like

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