Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

interseccion en mysql

Estas en el tema de interseccion en mysql en el foro de Mysql en Foros del Web. hola chicos alguno de uds sabe como hacer uan interseccion entre consultas, ya que mysql no soporta INTERSECT, alguna forma similar la consulta es la ...
  #1 (permalink)  
Antiguo 11/12/2007, 16:07
Avatar de liliancita  
Fecha de Ingreso: diciembre-2007
Mensajes: 189
Antigüedad: 16 años, 4 meses
Puntos: 0
Pregunta interseccion en mysql

hola


chicos alguno de uds sabe como hacer uan interseccion entre consultas, ya que mysql no soporta INTERSECT, alguna forma similar



la consulta es la siguiente

Cita:
SELECT
filtros.valor_filtro,
AB.*
FROM filtros,AB
WHERE AB.zona = filtros.valor_filtro
AND idPersona='1'
AND nom_filtro='primero'
INTERSECT
SELECT
filtros.valor_filtro,
AB.*
FROM filtros,AB
WHERE AB.fase = filtros.valor_filtro
AND idPersona='1'
AND nom_filtro='primero'
INTERSECT
SELECT
filtros.valor_filtro,
AB.*
FROM filtros,AB
WHERE AB.cod_sitio = filtros.valor_filtro
AND idPersona='1'
AND nom_filtro='primero'

saludos
  #2 (permalink)  
Antiguo 11/12/2007, 19:37
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Re: interseccion en mysql

Teoría de conjuntos: Una intersección entre conjuntos A, B, C, ...n n, es un conjunto tal que sus miembros están incluidos en todos los conjuntos.
Eso significa simplemente que hay que determinar cuáles son las tuplas de una tabla A que están incluidas en la junta natural entre las tablas B y C.
Para poder cumplir con el requerimiento, las tablas A, B y C deben tener elementos en común. Esto se da cuando haces:

SELECT * FROM B INNER JOIN C USING (a, b, c) WHERE B.d = val1 AND C.e = val2 AND B.f = val3;

Siendo a, b y c campos pertenecientes a ambas tablas, con el mismo nombre en ambas y cuyos valores coinciden entre registros en una relación 1:1.
De esta relacción surge una tabla derivada que llamaremos D y que es la intersección entre B y C.
Si realizamos un nuevo INNER JOIN entre esta derivada y la tabla A, obtendremos la intersección entre ambas:

SELECT * FROM A INNER JOIN (SELECT * FROM B INNER JOIN C USING (a, b, c) WHERE B.d = val1 AND C.e = val2 AND B.f = val3) AS D USING(d, e, f);

o bien

SELECT * FROM A INNER JOIN (SELECT * FROM B INNER JOIN C USING (a, b, c) WHERE B.d = val1 AND C.e = val2 AND B.f = val3) AS D USING(a, b, c);

El resultado es en uno u otro caso, la intersección de las tres tablas.
Los dos ejemplos son para destacar que el conjunto de cojncidencia puede no ser el mismo entre las dos primarias que entre la derivada y la tercera. Lo único importante es que existan en la derivada Y en la A para que la consulta funcione.

Tener en cuenta:
- Usar USING, porque es más rápido que usar ON a = b.
- Un INNER JOIN es más rápido que INTERSECT, porque INTERSECT calcula cada una de las tres consultas y luego compara los resultados. INNER JOIN simplemente hace un matching entre valores descartando a medida que lee y devuelve solamente los que conciden entre las dos tablas, el resto ni los mira.
- Si se desea realizar un XOR, las cláusulas a usar son LEFT JOIN o RIGHT JOIN, donde los resultantes de una tabla sean nulos (NULL). En ese caso la consulta se complica.

Finalmente, no puedo usar tu ejemplo, porque las tres consultas son idénticas en todo ssus elementos y el conjunto devuelto por INTERSECT sería igual al de un sólo SELECT (los tres resultados concidirían en todas las tuplas).

Saludos.

Última edición por gnzsoloyo; 11/12/2007 a las 19:42
  #3 (permalink)  
Antiguo 11/12/2007, 20:09
Avatar de liliancita  
Fecha de Ingreso: diciembre-2007
Mensajes: 189
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: interseccion en mysql

holisss
grax por la explicacion .... pero no entiendo a q te refieres con que no se puede usar en mi caso, se que las consultas son las mimas pero ello es porque no sonsulto por campos si no por los valores de los campos...pero tienen que ser esos select, significa entonces q en mi caso no puedo usar el USING o INNER JOIN?
  #4 (permalink)  
Antiguo 12/12/2007, 05:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Re: interseccion en mysql

Me refería a que si usase esa consulta en una tabla real con datos, como cada select me devovlería el mismo conjunto de datos la intersección resultante en vez de ser A interseccion B intersección C, sería A intersección A interesección A.

En cambio esto se repite 3 veces:
SELECT filtros.valor_filtro, AB.* FROM filtros, AB WHERE AB.zona = filtros.valor_filtro AND idPersona='1' AND nom_filtro='primero'

La intersección tiene sentido cuando los conjuntos de intersección contienen diferencias entre ellos y buscas solamente los elementos comunes entre todos.

En otras palabras, me refería a que no podía usar tu ejemplo para construir una consulta de lo que quería explicar porque no ser vería a simple vista cómo era el tema. Para ejempificar lo que digo, por lo menos deberían cambiar los nombres de las tablas que se consultan.

En cuanto a si es conveniente el USING o el ON, como te decía arriba, el USING requiere que el nombre de los campos iguaados sea el mismo en ambas tablas, de lo contrario hay que usar ON, que sí te permite vincular campos con nombres distintos, como es el caso en tu ejemplo:

SELECT filtros.valor_filtro, AB.*
FROM filtros1 INNER JOIN AB
ON AB.zona = filtros.valor_filtro AND abidPersona='1' AND filtros.nom_filtro='primero'
  #5 (permalink)  
Antiguo 12/12/2007, 07:24
Avatar de liliancita  
Fecha de Ingreso: diciembre-2007
Mensajes: 189
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: interseccion en mysql

hola ... grax nuevamente

mira esta consulta hize:

SELECT ab.zona, ab.fase, ab.cod_sitio
FROM ab
JOIN filtros ON ( ab.cod_sitio = filtros.valor_filtro )
WHERE filtros.idpersona = '1'
AND filtros.nom_filtro = 'filtro'


hace casi casi loq debe falta la interseccion entre ab.cod_sitio y ab.fase...estoy pegada en eso ... alguna sugerencia please :)

saludos
  #6 (permalink)  
Antiguo 12/12/2007, 13:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 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
  #7 (permalink)  
Antiguo 12/12/2007, 14:48
Avatar de liliancita  
Fecha de Ingreso: diciembre-2007
Mensajes: 189
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: interseccion en mysql

Hola Gonzalo... probe la consulta y me devuelve vacio, puede ser xq las tablas son muy similar a como lo detallaste pero con el detalle que los valores de un atributo de la tabla FILTROS corresponden a los atributos de la tabla AB


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

valores de campo_filtro son: fase,zona y cod_sitio que son los atributos de la tabla AB


en teoria de conjuntos seria algo asi lo que deseo devolver (zona1 u zona2) interseccion (cod_sitio1 u cod_sitio2) interseccion (fase1 u fase 2)

que seria ver por:
zona (todos los codigos que estan en esa zona)
zona-cod_sitio (todos los codigo pertenezca a la zona)
zona-cod_sitio-fase (todos los codigo pertenezca a la zona y la fase)


a lo cual tu sugerencia de restringir la búsqueda a las tuplas que cumplan lso criterios es genial no lo habia pensado

me entendiste la idea?

Código PHP:
SELECT ab.zonaab.faseab.cod_sitio
FROM ab
INNER JOIN filtros ON ab
.cod_sitio filtros.valor_filtro
XOR ab.fase filtros.valor_filtro
XOR ab.zona filtros.valor_filtro
WHERE 
(
filtros.idpersona '1'
AND filtros.nom_filtro 'tercero'

cambie tus AND por XOR pero = no esta correcto el resultado, aun no discrimina por fase

saludos

lilian

Última edición por liliancita; 12/12/2007 a las 15:09
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 13:59.