Ver Mensaje Individual
  #4 (permalink)  
Antiguo 26/06/2010, 15:47
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: no hace caso a condición

Bueno, uno de los problemas que tienes está relacionado con la lógica de las bases de datos, y eso se escapa a veces cuando entras en este territorio sin un poco de formación: Se tiene que aprender por el método prueba/error, y hasta que no deduzcas el error no podrás resolverlo.
El problema es que este tipo de errores es medio evasivo, a veces hasta para los experimentados.

El problema se origina, en esencia, en esta cuestión: Todo usuario tiene o cumple misiones, pero no en todas las misiones declaradas ha habido disparos. Al menos eso es lo que desprende del modelo de datos que posteas.

En tu ejemplo tienes dos tablas, pero se infiere una tercera: Usuarios. Esto es importante porque como la lectura de tablas en las bases de datos es de izquierda a derecha en el FROM, si la primera tabla no tiene referencia a un "nick" en especial, ese no aparecerá en la consulta.
Puntualmente, si el reporte es sobre los usuarios, deberás usar la tabla primaria como inicial. Luego, a esta tabla se la debe cruzar con las misiones, para establecer qué misiones han tenido los usuarios, y recién allí hacer una cruza con la tabla disparos, porque los disparos se producen en las misiones y no por fuera de ellas.
¿Se comprende?

La idea sería que la consulta base fuese algo así:
Código MySQL:
Ver original
  1.    usuarios U INNER JOIN misiones M ON U.nick = M.nick
  2.    LEFT JOIN disparos D ON (D.nick = U.nick AND D.mn = M.mn);
Esto debería devolver un listado por usuario de las misiones y de todos los disparos realizados, siendo que si la misión no tuvo disparos aún, ese dato aparecerá como NULL (de allí el LEFT JOIN: todo lo que esté a la izquierda, coincida o no con la tabla derecha que en este caso es "disparos"). Es importante que ese dato aparezca como NULL en esos casos.
Ahora bien, con esta consulta ya podemos afinar: Quieres los usuarios, por misión, cuando la misión es "Partial", sume los puntos totales por disparo, los del "Official 2" y los del resto como uno solo.
Podría ser algo así:
Código MySQL:
Ver original
  1.     U.nick,  
  2.     M.mn Mision,  
  3.     SUM(D.points) PuntosTotales,  
  4.     SUM(IF()) DisparosOf2,  
  5.     SUM(IF(D.ot IS NOT NULL AND D.ot<> 'Official 2'), 1, 0) DisparosResto
  6.    usuarios U INNER JOIN misiones M ON U.nick = M.nick
  7.    LEFT JOIN disparos D ON (D.nick = U.nick AND D.mn = M.mn)
  8. WHERE D.task = 'Partial'
  9. GROUP BY U.nick;

O bien algo así:
Código MySQL:
Ver original
  1.     U.nick,  
  2.     M.mn Mision,  
  3.     SUM(D.points) PuntosTotales,  
  4.     SUM(IF()) DisparosOf2,  
  5.     SUM(IF(D.ot IS NOT NULL AND D.ot IN ('Official 1', 'Official 1-1', 'Official 2', 'Official 2-2', '111 Sqdn Campaign', 'International', 'International Campaign')), 1, 0) DisparosResto
  6.    usuarios U INNER JOIN misiones M ON U.nick = M.nick
  7.    LEFT JOIN disparos D ON (D.nick = U.nick AND D.mn = M.mn)
  8. WHERE D.task = 'Partial'
  9. GROUP BY U.nick, M.mn;

Creo que podrías probarla, y si no da el resultado esperado podemos afinarla más.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)