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

conteo junto con joins devuelve mas resultados de los esperados

Estas en el tema de conteo junto con joins devuelve mas resultados de los esperados en el foro de Mysql en Foros del Web. El caso es que quiero contar valores de una tabla, y en lo posible hacer join a otras tablas para tomar en cuenta un dato. ...
  #1 (permalink)  
Antiguo 26/08/2011, 07:36
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
conteo junto con joins devuelve mas resultados de los esperados

El caso es que quiero contar valores de una tabla, y en lo posible hacer join a otras tablas para tomar en cuenta un dato. Pero al hacer los joins se incrementa el numero de los resultados. Y en principio no pude resolverlo con un GROUP BY.

Código MySQL:
Ver original
  1.      SELECT count(*) FROM Payments
  2.       LEFT JOIN Commissions_Payments AS CP USING (pay_id)
  3.       LEFT JOIN Commissions AS comm USING (comm_id)
  4.    WHERE user_id_approver IS NOT NULL AND user_id_payer IS NULL
  5.      AND comm_payed = 0
  6.     ) AS approved

Quiero aprender SQL mas a fondo. Porque si bien a veces escribo consultas "complejas" todavía no se muy bien como interpreta secuencialmente las querys. Si tienen algun link como para dar un paso mas, les agradecería.
  #2 (permalink)  
Antiguo 27/08/2011, 12:34
Avatar de timoteo666  
Fecha de Ingreso: agosto-2011
Ubicación: /home/Gdl
Mensajes: 242
Antigüedad: 13 años, 3 meses
Puntos: 11
Respuesta: conteo junto con joins devuelve mas resultados de los esperados

Por que no intentas con INNER JOIN en lugar de LEFT JOIN también te recomiendo que utilices alias 'AS' para las tablas.
http://www.maestrosdelweb.com/editorial/tutsql1/
  #3 (permalink)  
Antiguo 28/08/2011, 08:11
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
Respuesta: conteo junto con joins devuelve mas resultados de los esperados

Si, es cierto que INNER es lo correcto. Y para las tablas si uso alias, como podes ver. En lo que publiqué falta el alias para Payments, ok. Pero igual, si lo tuviera e hiciera esto: count(p.*) no lograría un resultado (sino un error, creo). Por qué?
  #4 (permalink)  
Antiguo 28/08/2011, 16: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: 17 años
Puntos: 2658
Respuesta: conteo junto con joins devuelve mas resultados de los esperados

Proque usando el asterisco cuentas los registros devueltos, tengan o no relación. Lo que debes hacer es usar LEFT JOIN y contar el campo de relación. Como en SQL el NULL no es un dato, no se contará.
__________________
¿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 28/08/2011, 16:34
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
Información Respuesta: conteo junto con joins devuelve mas resultados de los esperados

Cita:
Consiejo: Jamás uses la coma como JOIN, es siempre preferible usar INNER/LEFT/RIGHT JOIN, es mucho más eficiente por varias razones.
Gracias por el consejo, que no tenía tan presente la cuestion, y a veces si usaba comas.

Respecto a la consulta, si descomento las lineas siguientes obtengo 12 como resultado. Sin embargo, ejecutandola así como se ve, obtengo 4 (no 4 rows, sino el numero 4 por el count).
Código MySQL:
Ver original
  1.          SELECT COUNT(*) FROM Payments p
  2.         # LEFT JOIN Commissions_Payments AS CP USING (pay_id)
  3.          # LEFT JOIN Commissions AS comm USING (comm_id)
  4.        WHERE user_id_approver IS NOT NULL AND user_id_payer IS NULL
  5.          #AND comm_payed = 0        
  6.         ) AS approved
Si intento algo así COUNT(p.*) me da error. Y si pongo un group by tambien. O sea, como usar joins para tomar una condicion de otra tabla? No estoy pudiendo hacerlo.
  #6 (permalink)  
Antiguo 28/08/2011, 16:46
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
De acuerdo Respuesta: conteo junto con joins devuelve mas resultados de los esperados

Funcionó usar DISTINCT sobre el primary key (en vez de usar el asterisco):
Código MySQL:
Ver original
  1.          SELECT COUNT( DISTINCT p.pay_id ) FROM Payments p
  2.          LEFT JOIN Commissions_Payments AS CP USING (pay_id)
  3.           LEFT JOIN Commissions AS comm USING (comm_id)
  4.        WHERE user_id_approver IS NOT NULL AND user_id_payer IS NULL
  5.          AND comm_payed = 0        
  6.         ) AS approved

Creo que lo que estoy haciendo es similar a un group by.

Si alguien tiene un link a tutoriales SQL que hablen de estos temas, buenisimo.
  #7 (permalink)  
Antiguo 29/08/2011, 06:20
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: conteo junto con joins devuelve mas resultados de los esperados

Es un poco más efectivo si usas la PK de la segunda tabla, pero para el caso no es problema:
Código MySQL:
Ver original
  1.     COUNT( DISTINCT CP.pay_id ) Cant_pay_id
  2. FROM Payments p
  3.     LEFT JOIN Commissions_Payments CP USING (pay_id)
  4.     LEFT JOIN Commissions comm USING (comm_id)
  5.     user_id_approver IS NOT NULL AND
  6.     user_id_payer IS NULL
  7.     AND comm_payed = 0;
Y si, técnicamente el resultado es similar a usar GROUP BY, pero la diferencia de performance es que los registros distintos se van descartando a medida que se leen, y no al final, como en el GROUP BY.
Cuestiones de algoritmos de consulta.
En cuanto a tutoriales... más que en tutoriales, son temas que se tratan en los manuales. Te conviene ir al manual de referencia y leer los subtemas de cada uso, porque allí está la explicación de cómo MySQL optimiza cada cosa.
__________________
¿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: conteo, devuelve, join, joins, junto, query, 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 01:03.