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

[SOLUCIONADO] Resultados duplicados con distinct ...

Estas en el tema de Resultados duplicados con distinct ... en el foro de Bases de Datos General en Foros del Web. Buenas a to2, el caso es que tengo estas tablas: El caso es sencillo un usuario compra un licencia y al hacerlo se inserta la ...
  #1 (permalink)  
Antiguo 31/01/2013, 06:10
 
Fecha de Ingreso: abril-2010
Mensajes: 298
Antigüedad: 14 años, 6 meses
Puntos: 1
Resultados duplicados con distinct ...

Buenas a to2, el caso es que tengo estas tablas:




El caso es sencillo un usuario compra un licencia y al hacerlo se inserta la licencia y acto seguido el pago, hasta ahí todo bien pero a la hora de mostrar resultados referentes a licencias o pagos con las siguientes consultas:

1º SQL Me devulve datos relacionados con licencias:
Código MySQL:
Ver original
  1. SELECT licencias.*,tipolicencia.nombre as licencia,usuarios.nombre,apellidos,pagos.idpago from tipoLicencia
  2.         inner join licencias on tipoLicencia.idtipoLicencia=licencias.idtipoLicencia
  3.         inner join usuarios on licencias.idusuario=usuarios.idusuario
  4.         inner join pagos on usuarios.idusuario=pagos.idusuario
  5.         inner join ivas on pagos.idiva=ivas.idiva

2º SQL Me devulve datos relacionados con los pagos de las licencias anteriores:
Código MySQL:
Ver original
  1. SELECT pagos.*,usuarios.nombre,apellidos,ivaTexto,tipolicencia.nombre as licencia from tipoLicencia
  2.         inner join licencias on tipoLicencia.idtipoLicencia=licencias.idtipoLicencia
  3.         inner join usuarios on licencias.idusuario=usuarios.idusuario
  4.         inner join pagos on usuarios.idusuario=pagos.idusuario
  5.         inner join ivas on pagos.idiva=ivas.idiva

Si un usuario tiene una licencia y un pago asociado a la misma , muestra un resultado en ambas consultas, lo que es correcto, pero en el caso de que ese usuario tenga dos licencias o más y lo mismo en pagos , ambas consultas devuelven resultados duplicados.

He probado con distinct pero no consigo solucionarlo, quizas sea tema de los inner joins..

Alguna sugerencia??? Gracias!

Última edición por ferminako; 31/01/2013 a las 06:16
  #2 (permalink)  
Antiguo 31/01/2013, 06: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: 17 años
Puntos: 2658
Respuesta: Resultados duplicados con distinct ...

Cita:
pero en el caso de que ese usuario tenga dos licencias o más y lo mismo en pagos , ambas consultas devuelven resultados duplicados.
Eso no es duplicación.
Duplicación es cuando todos los campos devueltos en la consulta, absolutamente todos repiten valores entre diferentes registros.
Pero si al menos uno de esos campos tiene un dato diferente (la licencia, el pago, el monto), entonces eso no es duplicación. Es el resultado normal de una consulta con JOIN donde un registro de una tabla (la persona) se relaciona N veces con otra tabla (las licencias, por ejemplo) . Obviamente por cada licencia, se repetirá una serie de 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)
  #3 (permalink)  
Antiguo 31/01/2013, 12:14
 
Fecha de Ingreso: abril-2010
Mensajes: 298
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: Resultados duplicados con distinct ...

De acuerdo, lamento mi error conceptual , ahora lo veo más claro, de todas maneras como podria solucionarlo??? por que aunque sea el resultado logico de esas consultas, necesito que no se repitan :S

Gracias gnzsoloyo ;)
  #4 (permalink)  
Antiguo 31/01/2013, 14:53
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: Resultados duplicados con distinct ...

Cita:
necesito que no se repitan
¿Que no se repita un conjunto de datos?
La única forma de que no se repitan datos es que sólo invoques aquellos datos que efectivamente necesitas, y no uses el "*" para llamar a las tablas.
Es posible que lo que estés tratando de lograr es un tipo de reporte que te liste sólo el primer conjunto y luego, en columnas, aquellos datos que se diferencian. Eso no se logra simplemente con una consulta, o al menos no con SQL puro. Eso se hace por programación.
La consulta indefectiblemente te devolverá datos repetidos cuando se trate de esas situaciones, y es luego en programación donde muestras en pantalla esos datos dejando blancos en los renglones siguientes cuando el item se repite.
Es decir que en realidad se usan ambas cosas combinadas, pero la responsabilidad de la represenación de los datos no es de la base, ni del SQL.
¿Se va entendiendo?
__________________
¿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 31/01/2013, 15:21
 
Fecha de Ingreso: abril-2010
Mensajes: 298
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: Resultados duplicados con distinct ...

Entiendo lo que dices pero, no entiendo como conseguir lo que busco.

He realizado una prueba eliminando el * y poniendo lo datos exactos pero se sigue repitiendo, esta foto es de la segunda sql :



El usuario en cuestion tiene 2 pagos pero se repiten en el resultado y nos da 4 registros, y no se como evitarlo :(
  #6 (permalink)  
Antiguo 31/01/2013, 16:51
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: Resultados duplicados con distinct ...

Allí no hay duplicaciones porque la última columna "licencias", tiene dos valores diferentes: "Publicada" y "Licitada". Por esa razón se repiten.
Pero el problema, si miras con cuidado tu propio gráfico en el primer post, es que estás poniendo una única condición para vincular al pago con el usurio, y en realidad debe tener dos condiciones.
En principio, yo probaría:
Código MySQL:
Ver original
  1.     pagos.*,
  2.     u.nombre,
  3.     u.apellidos,
  4.     i.ivaTexto,
  5.     tl.nombre licencia
  6.     usuarios u  
  7.     INNER JOIN licencias l  on u.idusuario = l.idusuario
  8.     INNER JOIN pagos p      on u.idusuario = p.idusuario AND l.idLicencia = p.idLicencia
  9.     INNER JOIN ivas i       on p.idiva = i.idiva
  10.     INNER JOIN tipoLicencia tl ON l.idtipoLicencia = tl.idtipoLicencia
Aún no estoy seguro de que el resultado sea correcto, pero si no vinculas la licencia y el usuario con el pago al mismo tiempo, te hará un producto cartesiano de los usuarios con todos sus pagos, con todas sus licencias.
Las relaciones de FK no tienen solamente que ver con las restricciones de integridad referencia, sino también que deben respetarse para reconstruir la información que se ha dispersado en diferentes tablas, de modo de restaurar la operación original.

Otro detalle: El orden de los factores, en SQL, altera el producto, por lo que no debes poner las tablas en orden abitrario. Ve poniéndolas en orden jerárquico, te ayudará a reducir el tiempo de ejecución.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 01/02/2013, 04:23
 
Fecha de Ingreso: abril-2010
Mensajes: 298
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: Resultados duplicados con distinct ...

He probado tu sql
Código MySQL:
Ver original
  1. SELECT pagos.*,
  2. usuarios.nombre,
  3. apellidos,
  4. ivaTexto,
  5. tipolicencia.nombre as licencia
  6. from usuarios
  7.         inner join licencias on usuarios.idusuario=licencias.idusuario
  8.         inner join pagos on usuarios.idusuario=pagos.idusuario
  9.         inner join ivas on pagos.idiva=ivas.idiva
  10.         inner join tipolicencia on licencias.idtipoLicencia=tipolicencia.idtipoLicencia

Y el resultado es el mismo , que en la imagen de mi comentario anterior , esta claro que el usuario id 4 tiene 2 pagos :
El pago id 4 y el pag id 11 , pero necesito que no me duplique esa información.

El resultado que busco es este:

No el que tego actualmente que es este:



Quizás asi se me entiende mejor???

Lo que me estoy temiendo es que debere controlarlo por programación, debido a q lo que entiendo es que sql no me puede dar lo que busco no?

Gracias una vez más!

Última edición por ferminako; 01/02/2013 a las 04:35
  #8 (permalink)  
Antiguo 01/02/2013, 06:49
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: Resultados duplicados con distinct ...

Perdona, pero no has probado la consulta que te envié, sino la tuya, reordenada.
Mira con cuidado:
Código MySQL:
Ver original
  1.     pagos.*,
  2.     u.nombre,
  3.     u.apellidos,
  4.     i.ivaTexto,
  5.     tl.nombre licencia
  6.     usuarios u  
  7.     INNER JOIN licencias l  on u.idusuario = l.idusuario
  8.     INNER JOIN pagos p      on u.idusuario = p.idusuario AND l.idLicencia = p.idLicencia
  9.     INNER JOIN ivas i       on p.idiva = i.idiva
  10.     INNER JOIN tipoLicencia tl ON l.idtipoLicencia = tl.idtipoLicencia
__________________
¿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 01/02/2013, 08:08
 
Fecha de Ingreso: abril-2010
Mensajes: 298
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: Resultados duplicados con distinct ...

Perdon por el error, tenias razon no la modifique bien y tal como tu lo hiciste funciona correctamente, tanto para la primera como para la segunda sql , muchas gracias gnzsoloyo que hariamos sin ti!!!
  #10 (permalink)  
Antiguo 01/02/2013, 08:55
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: Resultados duplicados con distinct ...

No exageres...

Me alegro que haya servido... La cosa se estaba poniendo complicada y por un momento creí que había datos sucios.
Menos mal que no fue así.

Saludos.

__________________
¿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: distinct, duplicados, resultados, select, sql, tabla
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:40.