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

SELECT para contar partidos ganados

Estas en el tema de SELECT para contar partidos ganados en el foro de Mysql en Foros del Web. Buenas! Tengo que hacer un recuento de las victorias que unos usuarios de mi web van haciendo jornada tras jornada. tengo una tabla que es ...
  #1 (permalink)  
Antiguo 13/07/2012, 15:42
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 16 años, 6 meses
Puntos: 0
SELECT para contar partidos ganados

Buenas!

Tengo que hacer un recuento de las victorias que unos usuarios de mi web van haciendo jornada tras jornada.

tengo una tabla que es la siguiente:

Puntuacion (idpuntuacion, idusuario, idtemporada, jornada, puntosjornada)

Por cada jornada al hacer el recuento pues sale un ganador, que eso es facil de calcular, pero no se como hacer para que me de una clasificación por victorias de cada usuario por jornada.

Pongo un ejemplo y luego dejo otro con lo que me gustaría calcular

En en ejemplo omito el idpuntuacion porque no es relevante
Código TXT:
Ver original
  1. USUARIO-TEMPORADA-JORNADA-PUNTOSJORNADA
  2. ---------------------------------------------------------------
  3. User1 --> 1 --> 1 --> 25
  4. User2 --> 1 --> 1 --> 45
  5. User3 --> 1 --> 1 --> 20
  6. User4 --> 1 --> 1 --> 15
  7. User1 --> 1 --> 2 --> 20
  8. User2 --> 1 --> 2 --> 20
  9. User3 --> 1 --> 2 --> 55
  10. User4 --> 1 --> 2 --> 10

En el ejemplo ganaría en la jornada 1 el usuario 2 (User2) y en la jornada 2 ganaría el User3. Vale hasta ahi fácil, igual que poner una clasificación general por puntos.
Pero aquí viene lo que quiero yo

Querría una consulta en la que salgan las victorias que cada usuario ha hecho por jornada y por temporada, vamos una clasificación por victorias que según el ejemplo debería quedar asi pero que no tengo ni la mas remota idea de llevar a cabo:

Código TXT:
Ver original
  1. Usuario-Victorias-Puntostotales
  2. ---------------------------------------
  3. User3 --> 1 --> 75
  4. User2 --> 1 --> 65
  5. User1 --> 0 --> 45
  6. User4 --> 0 --> 25

Creo que lo he explicado todo bien
MUCHAS GRACIAS de antemano por vuestra ayuda!
  #2 (permalink)  
Antiguo 14/07/2012, 11:59
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: SELECT para contar partidos ganados

Código MySQL:
Ver original
  1. CREATE TABLE `puntuacion` (
  2.   `idpuntuacion` int(11) NOT NULL auto_increment,
  3.   `idusuario` int(11) NOT NULL,
  4.   `idtemporada` int(11) NOT NULL,
  5.   `jornada` int(11) NOT NULL,
  6.   `puntosjornada` int(11) NOT NULL,
  7.   PRIMARY KEY  (`idpuntuacion`)
  8.  
  9.  
  10. ////Inserto los datos de tu ejemplo pero con idUsuario 1,2,3,4
  11.  
  12.  
  13. SELECT SPuntos.idTemporada,
  14.        SPuntos.idUsuario,
  15.        ifnull(SbcVictorias.victorias,0) victorias,
  16.        SPuntos.puntos
  17. FROM ((SELECT p.idTemporada,
  18.               p.idUsuario,
  19.               SUM(p.puntosjornada)puntos
  20.        FROM Puntuacion p
  21.        GROUP BY idTemporada,idUsuario) SPuntos
  22.       (SELECT idTemporada,
  23.               idUsuario,
  24.               count(*) victorias
  25.        FROM (SELECT idTemporada,idUsuario
  26.               FROM Puntuacion p1
  27.              INNER JOIN
  28.              (SELECT max(p.puntosjornada) ganador
  29.               FROM Puntuacion p
  30.               GROUP BY idTemporada,jornada) pg
  31.              ON p1.puntosjornada=pg.ganador) ga
  32.        GROUP BY idTemporada,idUsuario) SbcVictorias
  33. ON SbcVictorias.idTemporada=SPuntos.idTemporada
  34.    AND SbcVictorias.idUsuario=SPuntos.idUsuario)
  35. ORDER BY victorias DESC, puntos DESC;

Esto te lo da por temporadas.... si quieres sumar temporadas es facil.

(Estoy suponiendo que no hay empates, si hay un empate cuenta dos ganadores)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 16/07/2012 a las 00:35
  #3 (permalink)  
Antiguo 14/07/2012, 18:43
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: SELECT para contar partidos ganados

Perfecto!! Lo probaré mañana sin falta y te digo que funcionó aunque supongo que si porque veo que te lo has currado haciendo tu mismo el ejemplo.
Muchas gracias!!!!!!!!!!!!
PD: Mañana te confirmo que me sirva pero como digo supongo que si, gracias de nuevo
  #4 (permalink)  
Antiguo 16/07/2012, 11:04
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: SELECT para contar partidos ganados

Hola yosoloyo:

Si bien el compañero quimfv ya te dio la respuesta, me hubiera gustado más que la hubieras sacado por tu propia cuenta... así podrías tomarla como experiencia para futuros desarrollos...

Creo que la consulta de quimfv podría quedar más sencilla, checa este script, debería regresar el mismo resultado, pero sin necesidad de anidar tantas subconsultas.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM puntuacion;
  2. +--------------+-----------+-------------+---------+---------------+
  3. | idpuntuacion | idusuario | idtemporada | jornada | puntosjornada |
  4. +--------------+-----------+-------------+---------+---------------+
  5. |            1 |         1 |           1 |       1 |            25 |
  6. |            2 |         2 |           1 |       1 |            45 |
  7. |            3 |         3 |           1 |       1 |            20 |
  8. |            4 |         4 |           1 |       1 |            15 |
  9. |            5 |         1 |           1 |       2 |            20 |
  10. |            6 |         2 |           1 |       2 |            20 |
  11. |            7 |         3 |           1 |       2 |            55 |
  12. |            8 |         4 |           1 |       2 |            10 |
  13. +--------------+-----------+-------------+---------+---------------+
  14. 8 rows in set (0.00 sec)
  15.  
  16. mysql> SELECT
  17.     ->   P.idtemporada,
  18.     ->   P.idusuario,
  19.     ->   IFNULL(T.victorias, 0) victorias,
  20.     ->   SUM(P.puntosjornada) puntos
  21.     -> FROM puntuacion P
  22.     -> LEFT JOIN
  23.     -> (SELECT COUNT(PP.idusuario) victorias, PP.idusuario
  24.     ->  FROM puntuacion PP
  25.     ->  INNER JOIN
  26.     ->   (SELECT MAX(puntosjornada) puntosjornada, jornada, idtemporada
  27.     ->    FROM puntuacion
  28.     ->    GROUP BY idtemporada, jornada) V
  29.     ->    WHERE
  30.     ->      V.idTemporada = PP.idTemporada AND
  31.     ->      V.jornada = PP.jornada AND
  32.     ->      V.puntosjornada = PP.puntosjornada
  33.     -> GROUP BY PP.idUsuario, PP.idTemporada
  34.     -> ) T ON T.idusuario = P.idusuario
  35.     -> GROUP BY P.idUsuario, idTemporada
  36.     -> ORDER BY victorias DESC, puntos DESC;
  37. +-------------+-----------+-----------+--------+
  38. | idtemporada | idusuario | victorias | puntos |
  39. +-------------+-----------+-----------+--------+
  40. |           1 |         3 |         1 |     75 |
  41. |           1 |         2 |         1 |     65 |
  42. |           1 |         1 |         0 |     45 |
  43. |           1 |         4 |         0 |     25 |
  44. +-------------+-----------+-----------+--------+
  45. 4 rows in set (0.00 sec)

Confío en que después de analizar la consulta comprendas la idea de lo que estamos haciendo, pero si tienes alguna duda nos la comentas para tratar de explicar mejor. Saludos

Saludos
Leo.
  #5 (permalink)  
Antiguo 18/07/2012, 17:25
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: SELECT para contar partidos ganados

Por supuesto antes de nada agradecer una vez mas la ayuda. Sigo sin poder probarlas pero estoy casi seguro que es lo que pido, sobretodo viendo la segunda respuesta que queda hasta la posible tabla clasificatoria.......

Para ya "ahondar" más aún, no se si mysql también puede hacer lo siguiente

De esa tabla que ha quedado
Código HTML:
Ver original
  1. +-------------+-----------+-----------+--------+
  2. | idtemporada | idusuario | victorias | puntos |
  3. +-------------+-----------+-----------+--------+
  4. |           1 |         3 |         1 |     75 |
  5. |           1 |         2 |         1 |     65 |
  6. |           1 |         1 |         0 |     45 |
  7. |           1 |         4 |         0 |     25 |
  8. +-------------+-----------+-----------+--------+
Se puede añadir directamente una "columna" mas que fuera la posición en la clasificación del usuario y asi no haya que hacer un contador ya directamente en php para saber la posición?
Me explico:
El usuario por ejemplo con idusuario = 2 que en esa clasificación es segundo..... hay alguna manera de que directamente en una consulta devuelva también que es el segundo clasificado de esa tabla sin necesidad de que se tenga como digo que recorrer ya desde php la consulto y averiguarlo a través de un bucle con un contador?

Siguiendo lo dicho por leonardo_josue, de que sea yo el que lo averigue, solo pido una explicación con la que pueda intentar sacarlo

Y sobretodo volver a dar las gracias a los dos: quimfv y leonardo_josue
  #6 (permalink)  
Antiguo 19/07/2012, 00:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: SELECT para contar partidos ganados

http://www.forosdelweb.com/f86/contador-mysql-963930/

Hay muchos post donde se ha contestado esto....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #7 (permalink)  
Antiguo 19/07/2012, 04:55
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: SELECT para contar partidos ganados

Perfecto! Gracias!

Etiquetas: partidos, select, 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 16:10.