Ver Mensaje Individual
  #7 (permalink)  
Antiguo 26/04/2013, 14:21
Avatar de dashtrash
dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Problema con Strpos

El código original hace strpos(), por lo que no se puede usar "=", y hay que hacer "LIKE".
Que va a ser lento, es seguro.Pero va a ser más rápido que PHP + transferencia de filas por la red + memoria usada para obtener todo el resultset...
En un one-liner:
Código PHP:
Ver original
  1. $cad="a b c d";
  2. $fields=array("pmx_nom","pmx_app","pmx_apm");
  3.  
  4. $res = mysql_query("select * from usr_pmx  WHERE ".implode(" OR ",array_map(function($p) use ($cad){return $p." LIKE '%".implode("%' OR ".$p." LIKE '%",explode(" ",$cad))."%'";},$fields));

Con 5 palabras en la entrada, esa query produce 15 "LIKE"s..
Otra opción podría ser concatenar los 3 campos, y hacer "LIKE"s sobre la concatenación (al fin y al cabo, los índices no los vamos a usar en ningún caso..)
Esto , podría hacerse con una query del tipo
Código MySQL:
Ver original
  1. ... WHERE CONCAT(pmx_nom ,' ',pmx_app,' ',pmx_apm) LIKE '%palabra1%' OR CONCAT...
3 concats y tantos OR como palabras

Y, otra cosa a probar es haciendo un solo concat, como una subquery
Código MySQL:
Ver original
  1. select * from (SELECT CONCAT(pmx_nom ,' ',pmx_app,' ',pmx_apm)  as total FROM usr_pmx ) concats WHERE total LIKE '%palabra1%' OR total LIKE '%palabra2%'...
Se hace 1 solo concat, y tantos LIKE como palabras hubiera en la cadena original.
Qué opción es mejor, no sabría decirlo sin probarlo..Supongo que el número de filas de la tabla será un factor importante.
Incluso el orden de los "OR" puede que sea importante.