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

Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Estas en el tema de Se pueden vincular 2 tablas en diferentes bases de datos en un query? en el foro de Mysql en Foros del Web. Hola amigos, tengo 2 bases de datos de las cuales quiero ver si se pueden vincular las dos bases de datos. en una base de ...
  #1 (permalink)  
Antiguo 18/04/2008, 14:32
Avatar de gokufast  
Fecha de Ingreso: abril-2007
Mensajes: 540
Antigüedad: 17 años
Puntos: 3
Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Hola amigos, tengo 2 bases de datos de las cuales quiero ver si se pueden vincular las dos bases de datos.

en una base de datos que se llama saldos tengo una tabla que se llama voluntario, y tengo otra base de datos que se llama dolares, y tambien tiene una tabla que se llama voluntario.

puedo hacer un query que pueda vincular ambas tablas??.

saludos
  #2 (permalink)  
Antiguo 20/04/2008, 12:10
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Si

Código:
SELECT nombrebase.nombretabla.nombrecampo,
             nombrebase2.nombretabla2.nombrecampo2
     FROM nobrebase.nombretabla, nobrebase2.nombretabla2;
En tu caso, y simplificandolo con alias

Código:
SELECT d.nombrecampo,
             s.nombrecampo2
     FROM saldos.voluntario s, dolares.voluntario d;
Como puedes deducir solo se trata de anteponer el nombre de la base de datos al nombre de la tabla.

(Estamos hablando de dos bases que residen en el mismo servidor...no?)


Quim
  #3 (permalink)  
Antiguo 21/04/2008, 14:13
 
Fecha de Ingreso: abril-2001
Mensajes: 293
Antigüedad: 23 años
Puntos: 0
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

recordemos que esta funcion solo corre en una version mysql 5.x hacia adelante.

saludos
  #4 (permalink)  
Antiguo 21/04/2008, 15:28
Avatar de gokufast  
Fecha de Ingreso: abril-2007
Mensajes: 540
Antigüedad: 17 años
Puntos: 3
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Ufa que genial esta eso, voy a probarlo y aviso como me fue
  #5 (permalink)  
Antiguo 21/04/2008, 16:48
Avatar de gokufast  
Fecha de Ingreso: abril-2007
Mensajes: 540
Antigüedad: 17 años
Puntos: 3
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

El query me salio de esta forma:
Código:
SELECT 
  	ufv.voluntario.vol_cod,
  	SUM(ifnull(ufv.voluntario.vol_depus, 0) - ifnull(ufv.voluntario.vol_retus, 0)) AS saldo_ufv,
	saldos.voluntario.vol_cod,
  	SUM(ifnull(saldos.voluntario.vol_depus, 0) - ifnull(saldos.voluntario.vol_retus, 0)) AS saldo_us
FROM
  	ufv.voluntario,
	saldos.voluntario
GROUP BY
  	ufv.voluntario.vol_cod AND
	saldos.voluntario.vol_cod
HAVING
  	saldo_ufv >= 2796 AND
	saldo_us >= 500
pero paso como 30 min. y no me dio ningun resultado.
  #6 (permalink)  
Antiguo 22/04/2008, 02:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Gracias cmunozp por la aclaración

gokufast, las consultas por separado te dan resultado? Tu version de MySQL es?

Código:
SELECT 
  	ufv.voluntario.vol_cod,
  	SUM(ifnull(ufv.voluntario.vol_depus, 0) - ifnull(ufv.voluntario.vol_retus, 0)) AS saldo_ufv,
FROM
  	ufv.voluntario,
GROUP BY
  	ufv.voluntario.vol_cod AND
HAVING
  	saldo_ufv >= 2796
Código:
SELECT 
	saldos.voluntario.vol_cod,
  	SUM(ifnull(saldos.voluntario.vol_depus, 0) - ifnull(saldos.voluntario.vol_retus, 0)) AS saldo_us
FROM
	saldos.voluntario
GROUP BY
	saldos.voluntario.vol_cod
HAVING
	saldo_us >= 500
No seran excluyentes?

Código:
  	saldo_ufv >= 2796 and saldo_us >= 500
Definiendo el JOIN?

Código:
SELECT 
  	ufv.voluntario.vol_cod,
  	SUM(ifnull(ufv.voluntario.vol_depus, 0) - ifnull(ufv.voluntario.vol_retus, 0)) AS saldo_ufv,
  	SUM(ifnull(saldos.voluntario.vol_depus, 0) - ifnull(saldos.voluntario.vol_retus, 0)) AS saldo_us
FROM
  	ufv.voluntario INNER JOIN saldos.voluntario 
                        ON ufv.voluntario.vol_cod = saldos.voluntario.vol_cod
GROUP BY
  	ufv.voluntario.vol_cod, <--- no AND
                saldos.voluntario.vol_cod
HAVING
  	saldo_ufv >= 2796 AND
	saldo_us >= 500
El JOIN debe ser INNER, LEFT, RIGHT....?

Son las preguntas que me haria yo...

Quim

Última edición por quimfv; 22/04/2008 a las 03:00
  #7 (permalink)  
Antiguo 22/04/2008, 06:46
Avatar de gokufast  
Fecha de Ingreso: abril-2007
Mensajes: 540
Antigüedad: 17 años
Puntos: 3
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Cita:
Iniciado por quimfv Ver Mensaje
gokufast, las consultas por separado te dan resultado? Tu version de MySQL es?
es el 5.1, y las consultas por separado funcionan
  #8 (permalink)  
Antiguo 22/04/2008, 09:54
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, 5 meses
Puntos: 2658
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Como yo lo veo tienes dos posibles opciones:
Código:
SELECT 
  	ufv.voluntario.vol_cod,
  	SUM(ifnull(ufv.voluntario.vol_depus, 0) - ifnull(ufv.voluntario.vol_retus, 0)) AS saldo_ufv,
	saldos.voluntario.vol_cod,
  	SUM(ifnull(saldos.voluntario.vol_depus, 0) - ifnull(saldos.voluntario.vol_retus, 0)) AS saldo_us
FROM
  	ufv.voluntario INNER JOIN saldos.voluntario USING(vol_cod) 
GROUP BY
  	ufv.voluntario.vol_cod AND
	saldos.voluntario.vol_cod
HAVING
  	saldo_ufv >= 2796 AND
	saldo_us >= 500;
Este sería el caso completo conforme al código enviado.
El tema, entonces es saber por qué ambas consultas funcionan por separado, pero no juntas.
Entonces debemos concluir que si cruzamos las tablas resultandes de ambas consultas, realizadas por separado, debería haber puntos de coincidencia:
Código:
SELECT * 
FROM 
(SELECT 
  	ufv.voluntario.vol_cod AS VOL_COD,
  	SUM(ifnull(ufv.voluntario.vol_depus, 0) - ifnull(ufv.voluntario.vol_retus, 0)) AS saldo_ufv,
FROM
  	ufv.voluntario
GROUP BY
  	ufv.voluntario.vol_cod 
HAVING
  	saldo_ufv >= 2796 ) AS Tabla1
INNER JOIN 

(SELECT 
	saldos.voluntario.vol_cod as VOL_COD,
  	SUM(ifnull(saldos.voluntario.vol_depus, 0) - ifnull(saldos.voluntario.vol_retus, 0)) AS saldo_us
FROM
	saldos.voluntario
GROUP BY
	saldos.voluntario.vol_cod
HAVING
	saldo_us >= 500) AS Tabla2
USING(VOL_COD)
WHERE
saldo_us >= 500 AND saldo_ufv >= 2796
;
Si no se produce una coincidencia de esta forma, entonces es que ninguna tupla cumple con ambas condiciones a la vez.
  #9 (permalink)  
Antiguo 22/04/2008, 10:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Insisto, creo que el group by se delimita con coma no con AND

Código:
GROUP BY
  	ufv.voluntario.vol_cod AND
	saldos.voluntario.vol_cod
Código:
GROUP BY
  	ufv.voluntario.vol_cod,
	saldos.voluntario.vol_cod
A parte de esto lo que dice gnzsoloyo biene a ser lo que te decia si las condiciones de where son excluyentes no te dara resultado, es decir si no hay coincidencia en los registros de una y otra consulta...

Otra cosa, a pesar de que estas en MySql 5.x que tipo de tablas estas usando InnoDB o MyIsam...?

En InnoDB funciona en MyIsam no se...


Quim
  #10 (permalink)  
Antiguo 22/04/2008, 13:34
Avatar de gokufast  
Fecha de Ingreso: abril-2007
Mensajes: 540
Antigüedad: 17 años
Puntos: 3
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Entonces debemos concluir que si cruzamos las tablas resultandes de ambas consultas, realizadas por separado, debería haber puntos de coincidencia:
Código:
SELECT * 
FROM 
(SELECT 
  	ufv.voluntario.vol_cod AS VOL_COD,
  	SUM(ifnull(ufv.voluntario.vol_depus, 0) - ifnull(ufv.voluntario.vol_retus, 0)) AS saldo_ufv,
FROM
  	ufv.voluntario
GROUP BY
  	ufv.voluntario.vol_cod 
HAVING
  	saldo_ufv >= 2796 ) AS Tabla1
INNER JOIN 

(SELECT 
	saldos.voluntario.vol_cod as VOL_COD,
  	SUM(ifnull(saldos.voluntario.vol_depus, 0) - ifnull(saldos.voluntario.vol_retus, 0)) AS saldo_us
FROM
	saldos.voluntario
GROUP BY
	saldos.voluntario.vol_cod
HAVING
	saldo_us >= 500) AS Tabla2
USING(VOL_COD)
WHERE
saldo_us >= 500 AND saldo_ufv >= 2796
;
Si no se produce una coincidencia de esta forma, entonces es que ninguna tupla cumple con ambas condiciones a la vez.
Si hay coincidencias!!!

La cuestion es esta:
- En la base Saldos en la tabla voluntario tengo un dato que es vol_cod=187, con saldo 100.

- En la base UFV en la tabla voluntario tengo un dato que es vol_cod=187, con saldo 550.

Quiere decir que tengo el mismo vol_cod en 2 lugares, pero con distintos saldos, osea el mismo socio tiene 2 cuentas. y en ambas cuentas cumple con la condicion que ser mayor a 2796 y mayor a 500.

En las coincidencias me salen todos esos socios que tienen 2 cuentas y que cumplen con las 2 condiciones y son 227 socios.

Ahora como hago puedo hacer lo siguiente?

Que solo me salga todos los socios que cumplen por lo menos una de las condiciones ( es por eso el cambio del AND por OR en saldo_us >= 500 AND saldo_ufv >= 2796 no?).
Y que ademas no me salgan los duplicados osea que el socio 187 que menciono antes solo me salga una vez, por una de sus cuentas no por ambas.

Espero haber sido claro, a veces me hago bolas explicando
  #11 (permalink)  
Antiguo 23/04/2008, 01:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Cita:
Iniciado por gokufast Ver Mensaje
Si hay coincidencias!!!

La cuestion es esta:
- En la base Saldos en la tabla voluntario tengo un dato que es vol_cod=187, con saldo 100.

- En la base UFV en la tabla voluntario tengo un dato que es vol_cod=187, con saldo 550.

Quiere decir que tengo el mismo vol_cod en 2 lugares, pero con distintos saldos, osea el mismo socio tiene 2 cuentas. y en ambas cuentas cumple con la condicion que ser mayor a 2796 y mayor a 500.

En las coincidencias me salen todos esos socios que tienen 2 cuentas y que cumplen con las 2 condiciones y son 227 socios.

Ahora como hago puedo hacer lo siguiente?

Que solo me salga todos los socios que cumplen por lo menos una de las condiciones ( es por eso el cambio del AND por OR en saldo_us >= 500 AND saldo_ufv >= 2796 no?).
Y que ademas no me salgan los duplicados osea que el socio 187 que menciono antes solo me salga una vez, por una de sus cuentas no por ambas.

Espero haber sido claro, a veces me hago bolas explicando
Lo rojo es nuevo, si quieres que cumplan una u otra condicion luego tendras que poner OR no AND.

Tienes claro que con "saldo_us >= 500 AND saldo_ufv >= 279" el socio 187 que mencionas no va a aparecer nunca puesto que NO cumple las dos condiciones.

Con "saldo_us >= 500 OR saldo_ufv >= 279" apareceria puesto que cumple una de las dos.

Pero con el join de los dos querrys que te proponia gnzsoloyo cambiando AND por OR tampoco saldria por que luego no se cumpliria la condicion del INNER JOIN puesto estaria en el resultado de una subconsulta y no en la otra.

Código:
SELECT 
  	ufv.voluntario.vol_cod,
  	SUM(ifnull(ufv.voluntario.vol_depus, 0) - ifnull(ufv.voluntario.vol_retus, 0)) AS saldo_ufv,
  	SUM(ifnull(saldos.voluntario.vol_depus, 0) - ifnull(saldos.voluntario.vol_retus, 0)) AS saldo_us
FROM
  	ufv.voluntario INNER JOIN saldos.voluntario 
                        ON ufv.voluntario.vol_cod = saldos.voluntario.vol_cod
GROUP BY
  	ufv.voluntario.vol_cod, 
HAVING
  	saldo_ufv >= 2796 OR
	saldo_us >= 500
Asi deberia salir, pero tambien te dará la info de la cuenta que no cumple puesto que ahora esta en el mismo registro, con el JOIN lo que estamos haciendo es juntar registro con registro. No te saldra duplicado pero te saldra la info de las dos cuentas en el mismo registro...

Quim
  #12 (permalink)  
Antiguo 23/04/2008, 15:07
Avatar de gokufast  
Fecha de Ingreso: abril-2007
Mensajes: 540
Antigüedad: 17 años
Puntos: 3
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

Para que sirve el USING()? ej. USING(VOL_COD)
  #13 (permalink)  
Antiguo 24/04/2008, 00:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

USING(VOL_COD)

o

ON ufv.voluntario.vol_cod = saldos.voluntario.vol_cod

indica que el join se hace por el campo indicado en este caso vol_cod, si en las dos tablas se llma igual puedes usar el USING si no tienes la posibilidad de la sintaxis del ON.


tabal INNER JOIN tabla2 USING(campo) hace que las parejas de registros en que el contenido "campo" sea igual se uniran, formando un solo registro, por lo que el select puede mostrar registros formados por los campos de ambas tablas.

INNER JOIN combina todos los registros que aparezcan en las dos tablas.

LEFT JOIN muestra todos los registros de la tabla de la izquierda combinados con los de la derecha donde se produzca la coincidencia (los campos de la tabla derecha apreceran con nulo si no hay coincidencia)

RIGHT JOIN idem a la inversa

la clausula ON o USING indica con que campo o campos hay que hacer la comparacion entre tablas

Quim
  #14 (permalink)  
Antiguo 30/04/2008, 07:42
 
Fecha de Ingreso: abril-2001
Mensajes: 293
Antigüedad: 23 años
Puntos: 0
Re: Se pueden vincular 2 tablas en diferentes bases de datos en un query?

la otra alternativa es crearte una vista en la base de datos de la tabla en cuestion y realizar la consulta haciendo referencia a la vista, en todo caso creo que en estos casos es mejor usar una query anidada ya que el tiempo de ejecucion es un poco alto.

saludos
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:02.