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

[SOLUCIONADO] Una simple operacion COUNT(), y hay un error xD ¿WHY?

Estas en el tema de Una simple operacion COUNT(), y hay un error xD ¿WHY? en el foro de Mysql en Foros del Web. Buenas! , simplemente , 3 tablas (campos resaltados, los que afectan a la consulta SQL) : Tabla Proyectos : Tabla Votos : Tabla Criticas : ...
  #1 (permalink)  
Antiguo 13/03/2013, 22:46
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Una simple operacion COUNT(), y hay un error xD ¿WHY?

Buenas! , simplemente , 3 tablas (campos resaltados, los que afectan a la consulta SQL) :

Tabla Proyectos :

Tabla Votos:


Tabla Criticas:


Consulta :
Código SQL:
Ver original
  1. SELECT Proyectos.nombre, COUNT(Votos.Puntuacion), AVG(Criticas.nota) FROM Proyectos LEFT JOIN Votos ON Proyectos.ProyectoID = Votos.targetid LEFT JOIN Criticas ON Proyectos.ProyectoID = Criticas.targetID WHERE Proyectos.ProyectoID = 1 GROUP BY Proyectos.nombre

Resultado :


¿por que COUNT(Votos.Puntuacion) , ME DEVUELVE 12? , tendría que ser 3 (ver tabla votos), teniendo en cuenta que , hasta donde yo se, he hecho bien la "aliniacion" de tablas extra.

Última edición por gnzsoloyo; 14/03/2013 a las 03:09 Razón: Grita
  #2 (permalink)  
Antiguo 14/03/2013, 01:24
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Una simple operacion COUNT(), y hay un error xD ¿WHY?

Si tienes 12 proyectos y usas LEFT JOIN para unir los proyectos con lo demás, es lógico que te cuente 12.
He observado que en algún caso, además, ofreces datos erróneos, al menos si buscas los que tienen targetid = 1. Resaltas uno que tiene target 105 y la media tampoco es la correcta, pero dinos qué quieres sacar exactamente para que podamos ayudarte mejor
  #3 (permalink)  
Antiguo 14/03/2013, 03:10
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Una simple operacion COUNT(), y hay un error xD ¿WHY?

A ver, es muy simple, veo que no has leido la consulta (y mira que creo que he expuesto la info muy facil de ver xD).


Si hubieses leido la consulta (mis ojos solo son capaces de contar 1 proyecto filtrado y tu mencionas 12), verias que no tiene nada que ver ese 105 (usuarioID) en la tabla votos que veo que mencionas, NO!, lo he puesto bien visible, en rojo, los campos : targetid y puntuacion.


Como digo es simple, la pregunta mas simple no creo que pueda ser, hago una funcion COUNT() a la tabla Votos, en la columna puntuación.

Asi mismo, la tabla votos esta relacionada y filtrada con y por Proyectos / ProyectoID, es simple, debería contar 3 y me da de resultado 12 ¿why?
  #4 (permalink)  
Antiguo 14/03/2013, 03:11
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: Una simple operacion COUNT(), y hay un error xD ¿WHY?

1) No grites.
2) Jurena tiene razón.
3) No estás manejando bien la consulta, el LEFT JOIN es traicionero si no tienes práctica.
__________________
¿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/03/2013, 03:14
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Una simple operacion COUNT(), y hay un error xD ¿WHY?

No se gritar mediante la escritura, dispenseme si hacia eco!


El caso, yo creo que se ve bien :
Código SQL:
Ver original
  1. FROM Proyectos LEFT JOIN Votos ON Proyectos.ProyectoID = Votos.targetid LEFT JOIN Criticas ON Proyectos.ProyectoID = Criticas.targetID WHERE Proyectos.ProyectoID = 1

Tabla principal : Proyectos , agredas : Votos + Criticas
Filtro : ProyectoID
Medio de relacion JOIN con proyectos : PoyectoID = targetid


No se, ¿que esta mal?
  #6 (permalink)  
Antiguo 14/03/2013, 03:45
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Una simple operacion COUNT(), y hay un error xD ¿WHY?

No es divertido (al menos para mi), intento ver que tipo de fallo hay pero no lo consigo, si algo esta mal, y alguien sabe por que , que por favor lo diga.
  #7 (permalink)  
Antiguo 14/03/2013, 03:48
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: Una simple operacion COUNT(), y hay un error xD ¿WHY?

El problema es un tema recurrente en este foro, es decir, no es l aprimera vez que le pasa a alguien, y es un tanto complicado de explicar bien.
En esencia es que estás haciendo un doble LEFT JOIN, con dos tablas apuntando a la misma, y ese tipo de consultas tiende a producir proyectos cartesianos, cuando no errores al usar funciones agregadas.
Tu consulta (un poco más limpia) es así:
Código MySQL:
Ver original
  1.     P.nombre,
  2.     COUNT(V.Puntuacion) Puntos,
  3.     AVG(C.nota) MediaNota
  4. FROM Proyectos P
  5.     LEFT JOIN Votos V ON P.ProyectoID = V.targetid
  6.     LEFT JOIN Criticas C ON P.ProyectoID = C.targetID
  7. WHERE P.ProyectoID = 1
  8. GROUP BY P.nombre
Cuando usas dos LEFT JOIN sobre la primera tabla, ambos operan en forma independiente, por lo que en realidad pueden producirse agregaciones de registros provenientes del segundo que ya están en el primero.
¿Se entiende?
Eso es simplemente porque el segundo left join no está teniendo en cuenta los resultados del primero.
Normalmente en estos casos lo que se debe hacer es que el segundo left join se vincule con la tabla resultado del primero, pero para ello la relación no debería ser con la tabla Proyectos, sino con la tabla Votos.
Obviamente hay un problema con eso: Si Las Críticas son de los Proyectos, y no tienen relación con los votos, entonces se volverían incompatibles las condiciones.
¿Se va entendiendo?
Ese es el tema central: Si no hay una relación entre Votos y Críticas, no puedes esta consulta así. Habría que construirla de otra forma completamente diferente.

Nota: En todo Foro (no sólo FDW), históricamente se ha considerado como "grito" si:
1) Escribes todo en mayúsculas.
2) Pones el texto más grande del estándar del editor.
3) Resaltas notoriamente con color un texto determinado.

Ya tienes los etiquetados, las negritas, los subrayados y las cursivas. ¿Para qué necesitas el resto?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 14/03/2013, 04:23
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Una simple operacion COUNT(), y hay un error xD ¿WHY?

gnzsoloyo, genial la explicación, aunque parezca irreal me acabas de deslumbrar de un solo plumazo un montón de dudas acerca de SQL.

Etiquetas: campos, cout, join, operacion, select, simple, 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 05:40.