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

Calcular rank del usuario (sumar y comparar campos en mysql)

Estas en el tema de Calcular rank del usuario (sumar y comparar campos en mysql) en el foro de Mysql en Foros del Web. Buenas tardes, anduve toda la mañana intentando y no me ha salido.. Buscaba crear una única query mysql (en lo posible) que sume una determinada ...
  #1 (permalink)  
Antiguo 22/01/2014, 13:00
Avatar de FaNaTyCk  
Fecha de Ingreso: enero-2008
Mensajes: 54
Antigüedad: 16 años, 3 meses
Puntos: 2
Pregunta Calcular rank del usuario (sumar y comparar campos en mysql)

Buenas tardes, anduve toda la mañana intentando y no me ha salido..

Buscaba crear una única query mysql (en lo posible) que sume una determinada cantidad de campos de cada usuario y los compare. El mismo usuario genera uno nuevo por cada sesión que inicia en el juego. Y los datos se almacenan por sesión que haga el user digamos.

Por ejemplo yo quería con la query obtener el puesto rank que esta ubicado el usuario sumando todos sus campos Shooting y comparándolas con el resto de los usuarios a los cuales también debería sumar sus Shooting para crear un rank (tabla) temporal y devolverle el Numero en que se encuentra posicionado.

Esta es mi tabla actual:


sumar campos "Total_Shooting" en el server_id '6' al user_id '3' y compararlos con el resto.

Llegue hasta acá:
SELECT sum(`Total_Shooting`) FROM `cs16_stats` WHERE `server_id` = '6' AND `user_id` = '3';

Me devuelve la suma correcta del usuario 3 en el server 6:


Pero hasta ahí llegan mis conocimientos. ¿Alguna ayuda?. Busque guías pero no las llego a comprender del todo, leí algo sobre crear una tabla temporal e insertar las sumas ahí, pero no me ha salido.

Lo ideal seria, sumar Total_Shooting de cada usuario, hacer lo mismo con Total_Deaths y restarselos a Total_Shooting, y luego compararlos hasta encontrar el puesto del usuario en el ranking.

Desde ya, muchas gracias por la ayuda.
  #2 (permalink)  
Antiguo 23/01/2014, 01:32
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular rank del usuario (sumar y comparar campos en mysql)

FaNaTyCK,
sacar eso para cada usuario (ojo, no sesión), sin contar ahora con el número de orden o ranking sería algo así
Código MySQL:
Ver original
  1.   user_id,
  2.   SUM(Total_Shooting) shooting,
  3.   SUM(Total_Deaths) deaths,
  4.   (SUM(Total_Shooting) - SUM(Total_Deaths)) puntuacion
  5.  FROM cs16_stats
  6. GROUP BY user_id ORDER BY puntuacion DESC

Esto te ofrecerá las puntuaciones de todos, pero hacer el ranking requiere o programación o perfilar la consulta para que te numere en orden. Mira a ver si esto es lo que quieres por lo que se refiere a la puntuación y luego seguiremos avanzando.

Última edición por jurena; 23/01/2014 a las 09:42
  #3 (permalink)  
Antiguo 23/01/2014, 08:34
Avatar de FaNaTyCk  
Fecha de Ingreso: enero-2008
Mensajes: 54
Antigüedad: 16 años, 3 meses
Puntos: 2
Respuesta: Calcular rank del usuario (sumar y comparar campos en mysql)

Sí, era justo lo que necesitaba.. pero bien, le agrego el where para que solo seleccione el servidor 6 y no otros

Código MySQL:
Ver original
  1.   user_id,
  2.   SUM(`Total_Shooting`) `shooting`,
  3.   SUM(`Total_Deaths`) `deaths`,
  4.   (SUM(`Total_Shooting`) - SUM(`Total_Deaths`)) `rank`
  5.  FROM `cs16_stats`
  6. WHERE `server_id` = '6'
  7. GROUP BY `user_id` ORDER BY `rank` DESC
  8. LIMIT 0, 15;

me lo devuelve correctamente:



Pero esto me serviría más para armar un Top15 mas que para saber en que puesto se encuentra rankeado el usuario. Y yo busco el puesto más que nada, para devolverle al usuario directamente en que numero se encuentra por ejemplo el user id 22999544 (que es el que esta 2do en la imagen). Esto no es para web, y necesito recibir una respuesta directa en vez de que el proceso la resuelva antes de mostrarla para no sobre cargar el servicio básicamente.

Con lo de "prefilar la consulta" no te comprendí bien. Muchas gracias por tu ayuda, me sirvió bastante :)
  #4 (permalink)  
Antiguo 23/01/2014, 09:57
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular rank del usuario (sumar y comparar campos en mysql)

A esas otras dos partes me refería con programar y perfilar. Me explico. Primero necesitas numerar el ranking. Debes hacerlo mediante variable. Yo he adaptado la consulta recomendada en las FAQ del foro. Luego mediante INNER JOIN uno el registro que quiero y traigo los datos que me interesan, incluida la posición. No lo he probado.
Código MySQL:
Ver original
  1. SELECT t2.Linea, t2.user_id, t2.server_id, t2.shooting, t2.deaths, t2.rank FROM cs16_stats INNER JOIN (SELECT
  2.     (@REG := @REG + 1) Linea,
  3.     t1.user_id,
  4.     t1.server_id,
  5.     t1.shooting,
  6.     t1.deaths,
  7.     t1.rank
  8. @REG :=0,
  9.   user_id,
  10.   server_id,
  11.   SUM(`Total_Shooting`) `shooting`,
  12.   SUM(`Total_Deaths`) `deaths`,
  13.   (SUM(`Total_Shooting`) - SUM(`Total_Deaths`)) `rank`
  14.  FROM `cs16_stats`
  15. WHERE `server_id` = '6'
  16. GROUP BY `user_id` ORDER BY `rank` DESC
  17. LIMIT 0, 15)t1)t2 ON cs16_stats.user_id=t2.user_id WHERE  cs16_stats.user_id = 22999544

Última edición por jurena; 23/01/2014 a las 10:06
  #5 (permalink)  
Antiguo 23/01/2014, 10:58
Avatar de FaNaTyCk  
Fecha de Ingreso: enero-2008
Mensajes: 54
Antigüedad: 16 años, 3 meses
Puntos: 2
Respuesta: Calcular rank del usuario (sumar y comparar campos en mysql)

Modifique un par de palabras y quite el limit, el resto esta todo igual.

Código MySQL:
Ver original
  1. SELECT t2.rank, t2.user_id, t2.server_id, t2.shooting, t2.deaths, t2.total FROM `cs16_stats` INNER JOIN (SELECT
  2.     (@REG := @REG + 1) `rank`,
  3.     t1.user_id,
  4.     t1.server_id,
  5.     t1.shooting,
  6.     t1.deaths,
  7.     t1.total
  8. @REG :=0,
  9.   `user_id`,
  10.   `server_id`,
  11.   SUM(`Total_Shooting`) `shooting`,
  12.   SUM(`Total_Deaths`) `deaths`,
  13.   (SUM(`Total_Shooting`) - SUM(`Total_Deaths`)) `total`
  14.  FROM `cs16_stats`
  15. WHERE `server_id` = '6'
  16. GROUP BY `user_id` ORDER BY `total` DESC)t1)t2 ON cs16_stats.user_id = t2.user_id WHERE cs16_stats.user_id = '22999544'
  17. LIMIT 0,1;

Los resultados son los siguientes:

Con el user 3:


Con el user 22999544:


Le agregué otro LIMIT al final para limitar la consulta:


Si no me equivoco, ahora tan solo debería desde el programa leer la respuesta con SQL_ReadResult( Query, 0 ) que vendría a ser el campo rank en la imagen. Nunca había usado INNER JOIN, solo LEFT pero no tan complejo como esto. Probaré y luego te cuento como me fue.

Muchísimas gracias!
  #6 (permalink)  
Antiguo 23/01/2014, 13:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular rank del usuario (sumar y comparar campos en mysql)

en lugar del LIMIT, añade GROUP BY cs16_stats.user_id al final, tras WHERE cs16_stats.user_id = 22999544, y así evitarás las repeticiones.

Código MySQL:
Ver original
  1. ... WHERE  cs16_stats.user_id = 22999544 GROUP BY cs16_stats.user_id
Una aclaración más. Si nunca habías usado INNER JOIN, dale un repaso a los JOIN y su uso pues ese conocimiento es básico para entender de bases de datos.

Última edición por jurena; 24/01/2014 a las 01:45

Etiquetas: calcular, campo, campos, rank, select, sql, tabla, usuario, usuarios
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 16:14.