MySQL - Ayuda INNER multiples tablas

   
Vista:

Ayuda INNER multiples tablas

Publicado por Kari (7 intervenciones) el 23/06/2010 16:08:01
Saludos!

Tengo esta consulta, todas las tablas que tengo estan relacionadas a través del id. Pero cuando la genera, los registros me salen repetidos, y ya verifique muchas veces que no esten repetidos en la BD, pero los registros luego de la consulta me salen 5,10 veces repetidos. Que error tengo por favor


SELECT caudal.id_estacion, movim_estacion.fecha, movim_estacion.hora, caudal.caudal, movim_estacion.observaciones
FROM
estacion
LEFT JOIN movim_estacion ON movim_estacion.id_estacion = estacion.id_estacion
LEFT JOIN caudal ON caudal.id_estacion = estacion.id_estacion
WHERE estacion.id_estacion = '1'
AND movim_estacion.id_estacion = '1'
AND caudal.id_estacion = '1'
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda INNER multiples tablas

Publicado por Gonzalo GC (339 intervenciones) el 23/06/2010 16:39:42
SELECT
C.id_estacion,
ME.fecha,
ME.hora,
C.caudal,
ME.observaciones
FROM estacion E INNER JOIN movim_estacion ME ON E.id_estacion = ME.id_estacion
INNER JOIN caudal C ON E.id_estacion = ME.id_estacion
WHERE E.id_estacion = '1';

Si sólo quieres los que cumplan la relación en las tres tablas simultáneamente debes usar INNER JOIN, no LEFT JOIN. Además, si se produce la igualdad, el where sólo requiere verificar el valor en una sola tabla. Las restantes son irrelevantes porque no hay posibilidad de valores no coincidentes al usar INNER JOIN .

Tip: Usa alias en las tablas para evitar códigos tan largos con alta posibilidad de errores de tipeo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda INNER multiples tablas

Publicado por Kari (7 intervenciones) el 23/06/2010 17:44:25
gracias por tu ayuda, ya intente y nada.

si igual, con esa sigue repitiendose y aparte me salen con los id= a 3
SELECT C.id_estacion, ME.fecha, ME.hora, C.caudal, ME.observaciones
FROM estacion E
INNER JOIN movim_estacion ME ON E.id_estacion = ME.id_estacion
INNER JOIN caudal C ON E.id_estacion = ME.id_estacion
WHERE E.id_estacion = '1'
****-----------------------------

me sale algo asi:

id_estacion fecha hora caudal observaciones
3 2010-05-05 00:00:00 920.60 una comparacion
3 2010-05-05 01:00:00 920.60 njbbbbbbbbbbm
3 2010-05-05 17:00:00 920.60 Ninguna
3 2010-05-05 00:00:00 920.60 cxdcx
3 2010-05-05 03:00:00 920.60 nkn
3 2010-05-05 05:00:00 920.60 rrrr
3 2010-06-11 09:00:00 920.60 cvbcv
3 0010-06-02 02:00:00 920.60 Ninguna observacion
3 2010-06-15 08:00:00 920.60
3 0010-06-09 03:00:00 920.60 CVVCBC
3 2010-05-05 00:00:00 55.65 una comparacion
3 2010-05-05 01:00:00 55.65 njbbbbbbbbbbm
3 2010-05-05 17:00:00 55.65 Ninguna
3 2010-05-05 00:00:00 55.65 cxdcx
3 2010-05-05 03:00:00 55.65 nkn
3 2010-05-05 05:00:00 55.65 rrrr
3 2010-06-11 09:00:00 55.65 cvbcv
3 0010-06-02 02:00:00 55.65 Ninguna observacion
3 2010-06-15 08:00:00 55.65
3 0010-06-09 03:00:00 55.65 CVVCBC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda INNER multiples tablas

Publicado por Omar (1 intervención) el 23/06/2010 19:16:39
Intenta asi:

SELECT C.id_estacion, ME.fecha, ME.hora, C.caudal, ME.observaciones
FROM estacion E
INNER JOIN movim_estacion ME ON E.id_estacion = ME.id_estacion
INNER JOIN caudal C ON E.id_estacion = C.id_estacion
WHERE C.id_estacion = '1'

Espero te funcione...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda INNER multiples tablas

Publicado por Gonzalo GC (339 intervenciones) el 23/06/2010 20:40:39
Técnicamente la respuesta es CORRECTA porque no hay repeticiones en los registros SI CONSIDERAMOS EL VALOR COMBINADO DE LOS CAMPOS COMO UNIDAD. Eso es simplemente porque hay alguna variación de datos entre ellos.

El problema puede ser que no estás realizando la consulta que deseas hacer realmente o bien no estás cruzando las tablas adecuadas, o en el extremo de los caso no estás usando las funciones de agrupamiento que deberías.

Empieza por el principio: ¿Qué es lo que se supone debe devolver esa consulta?
¿Un reporte DE QUE?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda INNER multiples tablas

Publicado por Kari (7 intervenciones) el 23/06/2010 23:04:36
Gracias! He revisado las relaciones entre tablas y es posible que tenga un error.

El resultado que quiero es que me salga: Todos los caudales ingresados que pertenecen a la estacion 1.
Porque hay 3 estaciones. (1,2,3)

Para ello yo tengo: las siguientes tablas:
ESTACION
CAUDAL
MOVIM_ESTACION
-...... y ciertas tablas que pertenecen a detalles de cada una de las otras estaciones , pero
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda INNER multiples tablas

Publicado por Gonzalo GC (339 intervenciones) el 23/06/2010 23:39:52
Bien. Con eso estamos más cerca.
La única duda es si quieres un listado:
------------------------------------------------------------------------------------------------------
Opcion 1:
------------------------------------------------------------------------------------------------------
SELECT E.id_estacion, ME.fecha, ME.hora, C.caudal, ME.observaciones
FROM estacion E INNER JOIN movim_estacion ME USING(id_estacion)
INNER JOIN caudal C USING(id_estacion)
WHERE E.id_estacion = '1'
ORDER BY ME.fecha, ME.hora, E.id_estacion;
------------------------------------------------------------------------------------------------------
Opcion 2:
------------------------------------------------------------------------------------------------------
SELECT E.id_estacion, ME.fecha, ME.hora, C.caudal, ME.observaciones
FROM estacion E INNER JOIN movim_estacion ME ON E.id_estacion = ME.id_estacion
INNER JOIN caudal C ON C.id_estacion = ME.id_estacion
WHERE E.id_estacion = '1'
ORDER BY ME.fecha, ME.hora, E.id_estacion;
------------------------------------------------------------------------------------------------------

O un acumulado:
SELECT E.id_estacion, SUM(C.caudal) Caudal
FROM estacion E INNER JOIN movim_estacion ME USING(id_estacion)
INNER JOIN caudal C USING(id_estacion)
WHERE E.id_estacion = '1'
GROUP BY E.id_estacion;

En cualquier caso, el problema estaba en el último JOIN que invocaba un campo equivocado, y en el primer campo del SELECT, que debía ser la primera tabla.

Pruebalo y veamos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar