Ver Mensaje Individual
  #6 (permalink)  
Antiguo 12/12/2007, 13:18
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 2 meses
Puntos: 2658
Re: interseccion en mysql

eamos...
Tenemos las tablas:

AB(ZONA, FASE, COD_SITIO)
FILTROS(VALOR_FILTRO, IDPERSONA, NOM_FILTRO)

La consulta devuelve una tabla derivada D1:

D1(ZONA, FASE, COD_SITIO)

Por lo que analizo, la idea es que los datos que devuelva la consulta final deben cumplir con los siguientes criterios:
- ZONA, FASE y COD_SITIO deben ser iguales entre sí (por transitividad, si a=d, b=d, c=d => a=b=c).
- ZONA, FASE y COD_SITIO deben ser iguales a VALOR_FILTRO
- La consulta debe devolver todos los campos de la tabla AB que cumplan con los dos criterios más el valor de VALOR_FILTRO correspondiente.

Si lo pensás, lo primero que debes hacer es restringir la búsqueda a las tuplas que cumplen el primer o el segundo criterio, de esa forma eliminarías una importante cantidad de tuplas.

Cita:
SELECT ab.zona, ab.fase, ab.cod_sitio
FROM ab
JOIN filtros ON ab.cod_sitio = filtros.valor_filtro AND ab.fase = filtros.valor_filtro AND ab.zona = filtros.valor_filtro ;
Y a eso hay que darle el condicional:
Cita:
SELECT ab.zona, ab.fase, ab.cod_sitio
FROM ab
JOIN filtros ON ab.cod_sitio = filtros.valor_filtro AND ab.fase = filtros.valor_filtro AND ab.zona = filtros.valor_filtro
WHERE (filtros.idpersona = '1'
AND filtros.nom_filtro = 'filtro')
Puse los () después del where para que considere la condición doble como una sola uniad.

Probalo y contame.

Saludos...

Gonzalo