Ver Mensaje Individual
  #9 (permalink)  
Antiguo 19/09/2013, 08:00
cmarrero01
 
Fecha de Ingreso: abril-2011
Ubicación: Mendoza
Mensajes: 42
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Ranking de lista de usuarios

Excelente, esta consulta casi funciona como espero... Me faltaria resolver 2 cosas en esta consulta...

1. Que me muestra una determinada cantidad de resultados arriba o abajo segun la posicion en la que caigo, por ejemplo, esta consulta, me devuelve el user 21 arriba de todo, y solo 2 resultados abajo, lo mismo pasaria con un usuario que aparezca abajo de todo, me mostraria solo 3 resultados por encima..

2. El ranking:
Esta parte, estoy pensando todavia como resolverla, necesito mostrar la posicion 1,2,3 segun sus puntos, por ejemplo el que mas puntos tiene esta en la posicion 1, y el que menos en X posicion, por ende, cuando muestro los resultados, deberia tener la posicion de cada uno, que dependeria de la tabla..


Aca hice un intento, pero veo que tenemos un problema con estas consultas, tanto la que me propones como la que yo intente hacer..
Código SQL:
Ver original
  1. BEGIN
  2.  
  3.     DECLARE countRankingTop INTEGER DEFAULT 0;
  4.     DECLARE countRankingBottom INTEGER DEFAULT 0;
  5.     DECLARE limitTop INTEGER DEFAULT 3;
  6.     DECLARE limitBottom INTEGER DEFAULT 2;
  7.  
  8.     SELECT COUNT(userId) INTO countRankingTop FROM bp_user_points b
  9. WHERE points >= (SELECT points FROM bp_user_points b WHERE userId = `userId`)
  10. AND userId != `userId`;
  11.  
  12.     SELECT COUNT(userId) INTO countRankingBottom FROM bp_user_points b
  13. WHERE points <= (SELECT points FROM bp_user_points b WHERE userId = `userId`)
  14. AND userId != `userId`;
  15.  
  16.  
  17.     SET @query = CONCAT("SELECT * FROM
  18. (SELECT b.userId,b.points,u.nicename as username,
  19. (SELECT count(userId)+1 FROM bp_user_points WHERE points >= b.points and userId != b.userId) as rank
  20. FROM bp_user_points b
  21. INNER JOIN bp_users u ON u.userId = b.userId
  22. WHERE points >= (SELECT points FROM bp_user_points b WHERE b.userId = ",userId,"  limit 1)
  23. AND b.userId != ",userId," order by b.points desc limit ",limitTop,") points
  24. UNION
  25. SELECT * FROM
  26. (SELECT b.userId,b.points,u2.nicename as username,
  27. (SELECT count(userId)+1 FROM bp_user_points WHERE points >= b.points and userId != b.userId) as rank  
  28. FROM bp_user_points b
  29. INNER JOIN bp_users u2 ON u2.userId = b.userId
  30. WHERE b.userId = ",userId,") points
  31. UNION
  32. SELECT * FROM
  33. (SELECT b.userId,b.points,u3.nicename as username,
  34. (SELECT count(userId)+1 FROM bp_user_points WHERE points >= b.points and userId != b.userId) as rank
  35. FROM bp_user_points b
  36. INNER JOIN bp_users u3 ON u3.userId = b.userId
  37. WHERE b.points <= (SELECT points FROM bp_user_points b WHERE b.userId = ",userId,"  limit 1)
  38. AND b.userId != ",userId," order by points desc limit ",limitBottom,") points;");
  39.  
  40.     PREPARE stmt FROM @query;
  41.     EXECUTE stmt;
  42.     DEALLOCATE PREPARE stmt;
  43.  
  44. END

Resulta que los resultados de arriba de un usuario determinado estan ordenados de tal manera que me muestra los primeros resultados de la tabla, no los 2 anteriores a mi, si no los primeros de la consulta, por ende el resultado si lo pusiera en un raking es asi:

1
2
5 (YO)
6
7

Si lo ordenas al revez, queda mal tambien.

Muchas gracias por la ayuda, con respecto al store procedure que arme, visto lo de los condicionales????, tenes idea por que no funcionan?, eso me solucionara el primero puntoq ue te menciono aca..

Abrazo y gracias
__________________
Claudio A. Marrero - Proyect Manager

Última edición por cmarrero01; 19/09/2013 a las 08:40