Ver Mensaje Individual
  #2 (permalink)  
Antiguo 17/07/2003, 13:40
josemi
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Podrias usar un campo como flag. Seria un campo numerico, solo tendrias que asignar una potencia de 2 a cada tipo de relacion, por ejemplo Amistad= 2^0 (2 a la 0) =1, Solo Sexo = 2^1 = 2, etc. Luego en ese campo flag almacenas la suma de los valores de los tipos de relaciones de ese registro (mas que suma, es un OR a nivel de bits de los valores). Asi, si solo tienes Amistad, el valor a almacenar seria 1, si es amistad y Solo Sexo, almacenarias 3 (1+2).

Al realizar la Busqueda, realizas la suma de lo que han elegido buscar. Luego en la consulta usas el operador a nivel de bits & para hacer el AND de los bits de ambos valores. El resultado del AND es cero si no hay ningun bit que coincida tener 1 en los dos operandos. La consulta seria algo asi:

SELECT * FROM donde_sea WHERE campo_flag & $valor_busqueda

Con esto te buscara todos aquellos que por lo menos cumplan un termino de busqueda. Si quieres buscar los que cumplan todos los terminos de busqueda:

SELECT * FROM donde_sea WHERE campo_flag & $valor_busqueda = $valor_busqueda

$valor_busqueda es la suma de las potencias de 2 de los tipos que quieres buscar.

El limite de tipos es el limite del tamaño del campo numerico del flag. Si usas un INT sin signo, creo que son valores de 0 a 4294967295, es decir, a 2^32 - 1, con lo que tienes para 32 tipos de relacion (de 2^0 a 2^31). Con esto tienes las 4294967296 combinaciones, creo que de sobra.

Espero haber sido de ayuda.

PD: ¿Se nota que he programado en ensamblador y C?
__________________
Josemi

Aprendiz de mucho, maestro de poco.