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

Consulta en dos tablas ( se duplican algunos datos )

Estas en el tema de Consulta en dos tablas ( se duplican algunos datos ) en el foro de Mysql en Foros del Web. Hola a todos, espero que esten bien. Estoy haciendo dos consultas SQL @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original SELECT COUNT ( nit ) AS resultado ...
  #1 (permalink)  
Antiguo 12/07/2010, 22:51
Avatar de richicasas  
Fecha de Ingreso: abril-2007
Ubicación: Colombia
Mensajes: 692
Antigüedad: 17 años
Puntos: 13
Exclamación Consulta en dos tablas ( se duplican algunos datos )

Hola a todos, espero que esten bien. Estoy haciendo dos consultas SQL
Código SQL:
Ver original
  1. SELECT COUNT(nit) AS resultado
  2. FROM ingresos
  3. WHERE  fecha_ingr >= '2010-07-01'
  4. AND fecha_ingr <= '2010-07-11'
  5. AND empresa_id = '06'
La anterior consulta me genera un numero, por ejemplo 282. hasta ahi bien.
Tengo una segunda consulta que me debe generar el mismo 282:
Código SQL:
Ver original
  1. SELECT COUNT(i.nit) AS resultado
  2. FROM ingresos i, usuarios u
  3. WHERE  i.fecha_ingr >= '2010-07-01'
  4. AND i.fecha_ingr <= '2010-07-11'
  5. AND i.empresa_id = '06'
  6. AND i.nit = u.nit
Pero me genera 8 registros mas, al analizar veo que se repiten algunos registros.

No entiendo porque es solo unos cuantos, analize los que se repiten y no tienen datos en comun.

Los atributos son masomenos los siguientes:

USUARIOS:
id
nit
empresa_id

INGRESOS
id
nit
empresa_id
fecha_ingr

Acaso en el segundo SQL cuando hago consulta sobre dos tablas me falta alguna instrucción adicional en el WHERE para que no se repitan ??

Gracias.
__________________
Juguetes Sexuales
  #2 (permalink)  
Antiguo 13/07/2010, 03:44
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
Respuesta: Consulta en dos tablas ( se duplican algunos datos )

Código MySQL:
Ver original
  1. SELECT COUNT(i.nit) resultado
  2. FROM ingresos i INNER JOIN usuarios u ON i.nit = u.nit
  3. WHERE  (i.fecha_ingr BETWEEN  '2010-07-01' AND i.fecha_ingr <= '2010-07-11' )
  4. AND i.empresa_id = '06';
__________________
¿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 13/07/2010, 23:42
Avatar de richicasas  
Fecha de Ingreso: abril-2007
Ubicación: Colombia
Mensajes: 692
Antigüedad: 17 años
Puntos: 13
De acuerdo Respuesta: Consulta en dos tablas ( se duplican algunos datos )

Gracias por responder gnzsoloyo, pero la consulta me arroja un numero mucho mayor, mas de 10 veces lo que me manda la consulta anterior.

Edito: Corregi el BETWEEN

Deje la consulta asi:
Código SQL:
Ver original
  1. SELECT COUNT(i.nit) resultado
  2.       FROM ingresos i INNER JOIN usuarios u ON i.nit = u.nit
  3.       WHERE  (i.fecha_ingr BETWEEN  '2010-07-01' AND  '2010-07-11' )
  4.       AND i.empresa_id = '06';

Sin embargo, sigue existiendo el mismo problema.

Basicamente el problema esta cuando consulto las dos tablas, si consulto la lista de ingresos para una empresa x me genera un dato normal. Pero al consultar en dos tablas eh ahi el problema. Yo pensaba que para no generar datos repetidos se validaban las llave primaria de la segunda tabla con su llave foranea en la primera tabla.
__________________
Juguetes Sexuales

Última edición por richicasas; 13/07/2010 a las 23:50
  #4 (permalink)  
Antiguo 14/07/2010, 06:25
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
Respuesta: Consulta en dos tablas ( se duplican algunos datos )

Analicemos la lógica de esto.
INNER JOIN hace que la consulta devuelva registros si y sólo si los campos puestos en el ON son iguales en valor. Únicamente. Eso implica una vinculación 1:1 entre los registros de la primera tabla con los de la segunda. Pero INNER JOIN no necesariamente se define por la PK, sino que puede cruzar cualquier tipo de campo con cualquier otro. La lógica de ese JOIN depende del usuario, no del DBMS, por lo que en realidad el problema es el tipo de datos que se crucen.

Así que, si la primera tabla es la que tiene la mayor cantidad de registros (considerando que haya más ingresos de uno de los usuarios, por ejemplo), la consulta debe devolver esa misma cantidad, o menor.

Ahora bien, para que la consulta cuente repetidamente registros en la primera tabla, se debe dar una única situación: Que haya dos o más registros en la segunda tabla que coincidan con uno sólo de la primera...

Pero para que eso se de, debe haber una condición necesaria: La segunda tabla no tiene definida su PK en el campo nit, o bien ese campo no se definió como UNIQUE (si no es PK).

En cualquier caso, debes revisar la tabla 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)
  #5 (permalink)  
Antiguo 14/07/2010, 07:51
Avatar de richicasas  
Fecha de Ingreso: abril-2007
Ubicación: Colombia
Mensajes: 692
Antigüedad: 17 años
Puntos: 13
Pregunta Respuesta: Consulta en dos tablas ( se duplican algunos datos )

Hola de nuevo,

La tabla ingresos puede contener uno o muchos ingresos por parte del mismo nit. (ahi no hay problema.)

Nit no es PK y no la defini como UNIQUE.

Revise la tabla de usuarios y no existen dos o mas usuarios con el mismo NIT. Es decir no existen usuarios repetidos por el NIT ni mucho menos por el id (autoincremento ).

Revisando los resultados los repetidos me aparecen con el mismo id de la tabla ingresos, por ejemplo, me aparecen tres registros con el mismo id de ingreso pero los demas datos diferentes. (Aclaro por si depronto es util, solo TRES registros con el mismo ID, es decir ID: 504 TRES REGISTROS de ese ID, ID 987 TRES REGISTROS DE ESE ID.)

Revisando la tabla ingresos no me aparecen esos ID repetidos, solo cuando hago la consulta de dos tablas.
__________________
Juguetes Sexuales
  #6 (permalink)  
Antiguo 14/07/2010, 08:13
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
Respuesta: Consulta en dos tablas ( se duplican algunos datos )

Vamos afinando.
Algunas preguntas:
1) Cuántos registros hay en la tabla Ingresos, con empresa_id = '06' y fecha entre el 01/07/2010 y el 11/07/2010, sin importar los NIT?
Es decir, esto:
Código MySQL:
Ver original
  1. SELECT COUNT(*) resultado
  2. FROM ingresos
  3. WHERE  (fecha_ingr BETWEEN  '2010-07-01' AND  '2010-07-11' ) AND empresa_id = '06';

2) ¿Cuántos NIT diferentes?
Código MySQL:
Ver original
  1. FROM ingresos
  2. WHERE  (fecha_ingr BETWEEN  '2010-07-01' AND  '2010-07-11' ) AND empresa_id = '06';

3) ¿Cuántos usuarios reales?
Código MySQL:
Ver original
  1. SELECT COUNT(*) usuarios
  2. FROM usuarios;
¿Y así?
Código MySQL:
Ver original
  1. SELECT COUNT(DISTINCT nit) usuariosNit
  2. FROM usuarios;
__________________
¿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 14/07/2010, 08:27
Avatar de richicasas  
Fecha de Ingreso: abril-2007
Ubicación: Colombia
Mensajes: 692
Antigüedad: 17 años
Puntos: 13
Pregunta Respuesta: Consulta en dos tablas ( se duplican algunos datos )

Cita:
Iniciado por gnzsoloyo Ver Mensaje
vamos afinando.
Algunas preguntas:
1) cuántos registros hay en la tabla ingresos, con empresa_id = '06' y fecha entre el 01/07/2010 y el 11/07/2010, sin importar los nit?
Es decir, esto:
Código mysql:
Ver original
  1. select count(*) resultado
  2. from ingresos
  3. where  (fecha_ingr between  '2010-07-01' and  '2010-07-11' ) and empresa_id = '06';

2) ¿cuántos nit diferentes?
Código mysql:
Ver original
  1. from ingresos
  2. where  (fecha_ingr between  '2010-07-01' and  '2010-07-11' ) and empresa_id = '06';

3) ¿cuántos usuarios reales?
Código mysql:
Ver original
  1. select count(*) usuarios
  2. from usuarios;
¿y así?
Código mysql:
Ver original
  1. select count(distinct nit) usuariosnit
  2. from usuarios;
1. = 282
2. = 70
3. = 10550
4. = 10515

Segun esta consulta, existen usuarios repetidos, pero hace una hora hice una consulta similar y me arrojaba igual cantidad de datos en ambas consultas, sera que por la cantidad puede generarse problemas??
__________________
Juguetes Sexuales
  #8 (permalink)  
Antiguo 14/07/2010, 08:35
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
Respuesta: Consulta en dos tablas ( se duplican algunos datos )

Cita:
sera que por la cantidad puede generarse problemas??
Exactamente, porque en ese caso el mismo registro de Ingreso se lista dos o tres veces, cruzandolo con diferentes usuarios, porque los mismos tienen idéntico NIT, cosa que es irregular...
El problema base es que si un NIT es un número único por persona o empresa ese campo debería ser UNIQUE para prevenir que haya duplicaciones.
Si el mismo NIT puede pertenecer o ser utilizado por diferentes usuarios, entonces la relación con ingreso debe ser realizada a través del user_id y no del NIT.
Si quieres saber cuáles son los NIT repetidos, usa esto:
Código MySQL:
Ver original
  1. SELECT nit
  2. FROM usuarios
  3. HAVING COUNT(*) >1;
Y si quieres saber cuáles son los usuarios:
Código MySQL:
Ver original
  1. FROM usuarios
  2. WHERE nit IN(SELECT nit
  3.     FROM usuarios
  4.     GROUP BY nit
  5.     HAVING COUNT(*) >1);
__________________
¿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 14/07/2010, 09:49
Avatar de richicasas  
Fecha de Ingreso: abril-2007
Ubicación: Colombia
Mensajes: 692
Antigüedad: 17 años
Puntos: 13
De acuerdo Respuesta: Consulta en dos tablas ( se duplican algunos datos )

Muchas gracias gnzsoloyo por la ayuda. Ya borre los duplicados y ahora si cuadran las consultas.

Saludos,
__________________
Juguetes Sexuales
  #10 (permalink)  
Antiguo 14/07/2010, 09: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: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta en dos tablas ( se duplican algunos 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)

Etiquetas: dos, tablas
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 12:33.