Ver Mensaje Individual
  #17 (permalink)  
Antiguo 20/11/2013, 17:48
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: busqueda - serialize - array

Mira, vamos por partes porque creo que te estas haciendo lio.

LIKE Y NOT LIKE lo que hacen es buscar un patron en un campo (algunos motores, soportan hasta una Exprecion Regular compleja) MySql no da gran soporte a las expresiones regulares, pero si permite hacer muchas cosas con el que tiene.

vamos a un ejemplo:

tu campo, contiene un array serializado, es decir que tiene esta forma:
Cita:
a:3:{i:0;s:1:{-NRO-1-};i:1;s:2:{-NRO-2-};i:2;s:2:{-NRO-3-};}
y, sabes, que uno de los caracteres de exprecion regular soportados por Mysql es el comodin "%".
cuando pones este simbolo, cualquier caracter que este en esa posición sera valido ¿Quieres buscar el signo %? jamaica no problem, lo escapas con la barra invertida "\%".

Ahora bien, ¿como aplicar esto? siguiendo la idea tu campo serializado ahora tendria esta forma:
Cita:
a:3:{i:0;s:1:"%";i:1;s:2:"%";i:2;s:2:"%";}
¡Yo quiero buscar un valor, no traer todos los registros! -genial, me gusta tu estilo.

Código MySQL:
Ver original
  1. SELECT campo FROM tabla WHERE campo LIKE "a:3:{i:0;s:1:\"%\";i:1;s:2:\"%\";i:2;s:2:\"%\";}"

¡Eso no hace nada! ¡Estoy igual que al principio! -no. ahora ya tienes la consulta armada.

Tu array descerializado tiene esta apariencia:
Cita:
Array ( [0] => 4 [1] => 24 [2] => 26 )
sabiendo que forma tienen los datos, ahora solo hay que meterlos en el sql:
Código PHP:
Ver original
  1. $buscarDatos = array(null,24,null);
  2.  
  3. $sql = 'SELECT campo FROM tabla WHERE campo LIKE "a:3:{i:0;s:1:\"'.(is_null($buscarDatos[0]) ? '%' : $buscarDatos[0]).'\";i:1;s:2:\"'.(is_null($buscarDatos[1]) ? '%' : $buscarDatos[1]).'\";i:2;s:2:\"'.(is_null($buscarDatos[2]) ? '%' : $buscarDatos[2]).'\";}"';
  4.  
  5. echo($sql);

La idea es simple, si el indice del array es null, se asume cualquier valor, si esta definido, se busca ese valor.

¡Quiero todos los que tengan indice 1 = 24, pero que el indice 0 sea diferente de 5! -ya puedes hacerlo solo ¿Lo intentaste?

aca esta la solucion, pero no la mires hasta que no allas probado al menos 20 veces solo.

Código PHP:
Ver original
  1. $buscarDatos = array(null,24,null);
  2. $excluirDatos = array(5,null,null);
  3.  
  4. $sql = 'SELECT campo FROM tabla WHERE campo LIKE "a:3:{i:0;s:1:\"'.(is_null($buscarDatos[0]) ? '%' : $buscarDatos[0]).'\";i:1;s:2:\"'.(is_null($buscarDatos[1]) ? '%' : $buscarDatos[1]).'\";i:2;s:2:\"'.(is_null($buscarDatos[2]) ? '%' : $buscarDatos[2]).'\";}" AND campo NOT LIKE "a:3:{i:0;s:1:\"'.(is_null($excluirDatos[0]) ? '%' : $excluirDatos[0]).'\";i:1;s:2:\"'.(is_null($excluirDatos[1]) ? '%' : $excluirDatos[1]).'\";i:2;s:2:\"'.(is_null($excluirDatos[2]) ? '%' : $excluirDatos[2]).'\";}" ';
  5.  
  6. echo($sql);

¡eso esta horrible! ¡son 4 lineas de codigo y tienen 2 bug! -jaja ya se, ¿no pensaras que te lo voy a dar servido?
como dice la frase, "si tu aplicaciones tiene bug, di que son features especiales"

la segunda alternativa no debe usarse si los tres indices a excluir son null, al revez de lo esperado, excluira a todos los resultados y devolvera vacio.

en un mismo indice no puede haber el mismo valor en buscar y en excluir, idem anterior.

creo con eso tu consulta tiene que estar resuelta.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios