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

Duplicado de registros con un inner join

Estas en el tema de Duplicado de registros con un inner join en el foro de Mysql en Foros del Web. Hola amigos tengo Duplicado en un inner join y no se a que se debe si el codigo esta bien pero no se a que ...
  #1 (permalink)  
Antiguo 18/11/2015, 11:45
Avatar de joseanguiano  
Fecha de Ingreso: agosto-2015
Ubicación: Coatzacoalcos
Mensajes: 87
Antigüedad: 9 años, 2 meses
Puntos: 1
Pregunta Duplicado de registros con un inner join

Hola amigos tengo Duplicado en un inner join y no se a que se debe si el codigo esta bien pero no se a que se deba que se dubliquen los datos en los registros ya me ha pasado mas de una vez y no puedo resolverlo saben por que? ya he buscado en google como loco pero no doy con el resultado deseado

Código MySQL:
Ver original
  1. entrada.hora_entrada,
  2. entrada.fecha_entrada,
  3. salida.hora_salida,
  4. salida.fecha_salida
  5.        
  6. from entrada
  7. inner join salida on entrada.clave_t_e=salida.clave_t_s
  8. order by clave_t_e,fecha_entrada,hora_entrada

Quiero hacer un reporte tan sencillo como eso pero es que ni eso me sale los datos me los manda pero dublicados

por ejmplo si tengo 2 registros de los dublicado dos veces mas alguien tiene una idea o esta mal mi codigo?

saludos espero sus ayudas
__________________
Lo fácil, ya lo hice, lo difícil lo estoy haciendo y lo imposible, me tardare pero lo lograre.
  #2 (permalink)  
Antiguo 18/11/2015, 11:54
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Duplicado de registros con un inner join

te faltaria agregar un discriminante como la fecha....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 18/11/2015, 12:09
Avatar de joseanguiano  
Fecha de Ingreso: agosto-2015
Ubicación: Coatzacoalcos
Mensajes: 87
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Duplicado de registros con un inner join

Cita:
Iniciado por Libras Ver Mensaje
te faltaria agregar un discriminante como la fecha....
Hola libra gracias por responder pero no entiendo a que te refiere con un descriminante para la fecha, pero lo que no entiendo es por que si al quitar incluso a fecha y la hora me sigue duplicando

mira

Código MySQL:
Ver original
  1. entrada.clave_t_e,
  2. salida.clave_t_s
  3.  
  4.  
  5.        
  6. from entrada
  7. inner join salida on entrada.clave_t_e=salida.clave_t_s
  8. order by clave_t_e

y con esto sigo obteniendo registros duplicados
__________________
Lo fácil, ya lo hice, lo difícil lo estoy haciendo y lo imposible, me tardare pero lo lograre.
  #4 (permalink)  
Antiguo 18/11/2015, 12:19
Avatar de 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
Puntos: 2658
Respuesta: Duplicado de registros con un inner join

Nuevamente el mismo tema de siempre...

Bueno, vamos otra vez:

En primer lugar tienes que tener claro que en BBDD se considera que dos registros están duplicados si y sólo si todos los valores en todas las columnas se repiten entre dos registros cualesquiera. SI al menos uno de los valores entre ambos registros es diferente al otro, eso NO ES DUPLICACION.
Dicho esto, aclaremos lo segundo: En un INNER JOIN relacionas cada registro de la primera tabla con UNO O MAS DE UNO de los registros de la segunda, y la base devolverá todos los valores pedidos de la primera tabla una vez por cada coincidencia con la segunda tabla.
Esto es el comportamiento NORMAL y ESPERADO de un INNER JOIN.
¿Eso queda claro?

Ahora bien, si lo que tu quieres es que no se repitan lso datos de la primera tabla, por cada registro diferente de la segunda donde coinciden, eso se hace por programación, en la presentación al usuario. NO en la base.

Llegado a este punto, te pido que nos muestres una captura de pantalla del resultado de la consulta que tu dices que está duplicada, y un ejemplo de como dices que debería salir.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 18/11/2015, 12:20
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Duplicado de registros con un inner join

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Nuevamente el mismo tema de siempre...

Bueno, vamos otra vez:

En primer lugar tienes que tener claro que en BBDD se considera que dos registros están duplicados si y sólo si todos los valores en todas las columnas se repiten entre dos registros cualesquiera. SI al menos uno de los valores entre ambos registros es diferente al otro, eso NO ES DUPLCIACION.
Dicho esto, aclaremos lo segundo: En unINNER JOIN relacionas cada registro de la primera tabla con UNO O MAS DE UNO de los registros de la segunda, y la base devolverá todos los valores pedidos de la primera tabla una vez por cada coincidencia con la segunda tabla.
Esto es el comportamiento NORMAL y ESPERADO de un INNER JOIN.
¿Eso queda claro?

Ahora bien, si lo que tu quieres es que no se repitan lso datos de la primera tabla, por cada registro diferente de la segunda donde coinciden, eso se hace por programación, en la presentación al usuario. NO en la base.

Llegado a este punto, te pido que nos muestres una captura de pantalla del resultado de la consulta que tu dices que está duplicada, y un ejemplo de como dices que debería salir.
:apla uso: y una ovacion de pie
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 18/11/2015, 12:51
Avatar de joseanguiano  
Fecha de Ingreso: agosto-2015
Ubicación: Coatzacoalcos
Mensajes: 87
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Duplicado de registros con un inner join

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Nuevamente el mismo tema de siempre...

Bueno, vamos otra vez:

En primer lugar tienes que tener claro que en BBDD se considera que dos registros están duplicados si y sólo si todos los valores en todas las columnas se repiten entre dos registros cualesquiera. SI al menos uno de los valores entre ambos registros es diferente al otro, eso NO ES DUPLICACION.
Dicho esto, aclaremos lo segundo: En un INNER JOIN relacionas cada registro de la primera tabla con UNO O MAS DE UNO de los registros de la segunda, y la base devolverá todos los valores pedidos de la primera tabla una vez por cada coincidencia con la segunda tabla.
Esto es el comportamiento NORMAL y ESPERADO de un INNER JOIN.
¿Eso queda claro?

Ahora bien, si lo que tu quieres es que no se repitan lso datos de la primera tabla, por cada registro diferente de la segunda donde coinciden, eso se hace por programación, en la presentación al usuario. NO en la base.

Llegado a este punto, te pido que nos muestres una captura de pantalla del resultado de la consulta que tu dices que está duplicada, y un ejemplo de como dices que debería salir.


Hola gnzsoloyo si lo se nuevamente lo mismo

he subido las imagenes si alcanzan a ver tengo dos tablas en las cuales puedes exister muchos registros con una sola matricula y en la otra que es de salida igual pueden ver muchos registros con esa matricula por otro lado en la otra imagen se muestra como hago el select

ya se que me lo habias explicado pero no se por que la repeticion (no se como llamarle)

les agradesco a los dos






http://imgur.com/ubs3CGx
http://imgur.com/SHugHmC
__________________
Lo fácil, ya lo hice, lo difícil lo estoy haciendo y lo imposible, me tardare pero lo lograre.
  #7 (permalink)  
Antiguo 18/11/2015, 12:58
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Duplicado de registros con un inner join

Agrega el campo fecha a tu where, q seria el discriminante q te comente
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 18/11/2015, 13:01
Avatar de 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
Puntos: 2658
Respuesta: Duplicado de registros con un inner join

Ya veo...

Creo que esto ya te lo explicamos en otra ocasión, y es que a tus condiciones el falta un discriminante que relacione correctamente los datos. En tu caso, entrada y salida corresponden al mísmo día:
Código MySQL:
Ver original
  1. SELECT  
  2.          E.fecha_entrada,
  3.          E.hora_entrada,
  4.          e.clave_t_e,
  5.          s.fecha_salida,
  6.          s.hora_salida
  7.     FROM entrada e
  8.          INNER JOIN salida s ON e.clave_t_e = s.clave_t_s
  9.                             AND E.fecha_entrada = s.fecha_salida
  10. ORDER BY E.fecha_entrada, s.fecha_salida, e.clave_t_e;

Cuidado: ten en cuenta que no estás considerando la posibilidad de que entre en un día y salga en el otro. Esta query no funcionará bien con las fechas cruzadas.

La "duplicación" se da porque la clave relacionada en todos los días es siempre la misma. En ese caso no es un error de MySQL. Es un error de discriminación y relación de los datos.
Debes aprender a ver claramente las relaciones y deducir las condiciones que debe cumplir el resultado correcto. No estabas teniendo en cuenta el resto de los datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 18/11/2015, 13:23
Avatar de joseanguiano  
Fecha de Ingreso: agosto-2015
Ubicación: Coatzacoalcos
Mensajes: 87
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Duplicado de registros con un inner join

Cita:
Iniciado por Libras Ver Mensaje
Agrega el campo fecha a tu where, q seria el discriminante q te comente
Hola Agradesco a los dos por ayudarme mas sin embargo es obligatorio que mi descriminante se una fecha por que esto fue lo que hice y efectivamente como dice libra mas arriba le agrege un descriminante a la fecha

Código MySQL:
Ver original
  1. SELECT entrada.fecha_entrada,
  2.        entrada.hora_entrada,
  3.        entrada.clave_t_e,
  4.        salida.fecha_salida,
  5.        salida.hora_salida
  6.      
  7. from entrada
  8.  
  9. inner join salida
  10. where entrada.fecha_entrada='2015-11-01' AND salida.fecha_salida='2015-11-01'
  11. order by fecha_entrada,fecha_salida,clave_t_e


por otro lado me gusta la idea de la descriminacion pero no habriera manera de que se pueda llamar esos datos solo por la clave_t_e que tenia anteriormente.


gracias a los dos y nuevamente por explicarme de nuevo
__________________
Lo fácil, ya lo hice, lo difícil lo estoy haciendo y lo imposible, me tardare pero lo lograre.
  #10 (permalink)  
Antiguo 18/11/2015, 13:46
Avatar de 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
Puntos: 2658
Respuesta: Duplicado de registros con un inner join

Estás confundiendo la relacion de las tablas en el FROM con la condición de la fecha en el WHERE...

Por favor, entiendee que NO SIRVE la query si no le pones la condición que te indicamos:
Código MySQL:
Ver original
  1. SELECT  
  2.          E.fecha_entrada,
  3.          E.hora_entrada,
  4.          e.clave_t_e,
  5.          s.fecha_salida,
  6.          s.hora_salida
  7.     FROM entrada e
  8.          INNER JOIN salida s ON e.clave_t_e = s.clave_t_s
  9.                             AND E.fecha_entrada = s.fecha_salida
  10. ORDER BY E.fecha_entrada, s.fecha_salida, e.clave_t_e;
Fijate que la relación NO SE PONE EN EL WHERE, sino en el FROM.
¿Se entiende?
En el WHERE pones la condición para la fecha que necesites:

Código MySQL:
Ver original
  1. SELECT  
  2.          E.fecha_entrada,
  3.          E.hora_entrada,
  4.          e.clave_t_e,
  5.          s.fecha_salida,
  6.          s.hora_salida
  7.     FROM entrada e
  8.          INNER JOIN salida s ON e.clave_t_e = s.clave_t_s
  9.                             AND E.fecha_entrada = s.fecha_salida
  10. WHERE E.fecha_entrada = '2015-11-01'
  11. ORDER BY E.fecha_entrada, s.fecha_salida, e.clave_t_e;
En esas condiciones es innecesario compararlos con ambos campos, porque los campos ya están igualados en el FROM. ¿Lo puedes ver?

Bueno, en cuanto a esto:
Cita:
no habriera manera de que se pueda llamar esos datos solo por la clave_t_e que tenia anteriormente.
NO, no, no, y absolutamente NO.
La clave es INSUFICIENTE para generar el INNER JOIN, porque te genera un PRODUCTO CARTESIANO.
NO SIRVE SOLO LA CLAVE.

¿Está suficientemente claro?

SI no le pones la segunda condición, relacionando las fechas, NO funcionará.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: inner-join
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 08:18.