Ver Mensaje Individual
  #4 (permalink)  
Antiguo 17/07/2003, 15:27
josemi
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hombre, siempre tienes la opcion de crear una tabla intermedia para guardar las distintas relaciones de un registro. Es lo que se usa para cuando un registro se puede ralicionar con 0 o muchos registros de otra tabla. La estructura seria:

tabla: Registros (ID_registro, demas campos)
Tabla:Relaciones (ID_relacion, nombre de la relacion)
Tabla: Relaciones_registro (ID_registro, ID_relacion)

Si el registro 1 tiene las relaciones 1, 3 y 8 (amistad, solo sexo y sado), la tabla Relaciones_registro tendra estos 3 registros:

ID_registro -- ID_relacion
1 ------------------- 1
1 ------------------- 3
1 ------------------- 8

Luego para la busqueda, primero tienes que sacar la lista de ID_registros que tienen alguna de la relacion seleccionada. La consulta seria:

SELECT DISTINCT ID_registro FROM Relaciones_registros WHERE ID_relacion IN (lista de los ID_relacion seleccionados para la busqueda separados por comas)

Con esto obtienes el listado de los ID_registros que tiene alguna de los tipos de relacion a buscar. Luego haces esta otra consulta para sacar los datos completos:

SELECT * FROM Registro WHERE ID_registro IN (la lista de ID_registro que has obtenido de la consulta anterior separada por comas)

Si quieres podrias hacer las dos consultas en una:

SELECT DISTINCT Registro.* FROM Relaciones_registros LEFT JOIN Registro ON (ID_registro) WHERE ID_relacion IN (lista de los ID_relacion seleccionados para la busqueda separados por comas)

Ahora no recuerdo como se haria para el caso en que quieres los registros que tengan todos los tipos de relaciones especificadas en la busqueda, pero supongo que seria algo con GRUP BY, count() y HAVING.

Como ves, haciendolo mas "visual" aumentas el numero de tablas y complicas las consultas. Pero te doy la razon, se ve mas claro que con los flags (siempre que no tengas experiencia con ellos ).

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.