Ver Mensaje Individual
  #7 (permalink)  
Antiguo 19/09/2013, 06:56
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

Bien, gracias.. Probe la query que me pasaste, y sigo con el mismo problema "Subquery return more than 1 result"...

Despues de mirar muchos tutoriales, manuales y de mas cuestiones llegue a la conclusion de modificar mis tablas..

Lo que hice fue agregar una sola tabla que mantendra un solo registro por usuario...

Esto me soluciona bastante las cosas, pero aun sigo sin lograr el resultado esperado en una varidad de pruebas, el codigo siguiente funciona a medias:

Código SQL:
Ver original
  1. BEGIN
  2.     DECLARE countRankingTop INTEGER DEFAULT 0;
  3.     DECLARE countRankingBottom INTEGER DEFAULT 0;
  4.     DECLARE limitTop INTEGER DEFAULT 3;
  5.     DECLARE limitBottom INTEGER DEFAULT 2;
  6.  
  7.     SELECT COUNT(userId) INTO countRankingTop FROM bp_user_points b
  8. WHERE points >= (SELECT points FROM bp_user_points b WHERE userId = `userId`)
  9. AND userId != `userId`;
  10.  
  11.     SELECT COUNT(userId) INTO countRankingBottom FROM bp_user_points b
  12. WHERE points <= (SELECT points FROM bp_user_points b WHERE userId = `userId`)
  13. AND userId != `userId`;
  14.  
  15. IF countRankingTop < 3 THEN
  16.     SET limitBottom = 3 - countRankingTop + 3;
  17. ELSE
  18.     SET limitBottom = 2;
  19. END IF;
  20.  
  21. IF countRankingBottom < 2 THEN
  22.     SET limitTop = 2 - countRankingBottom + 2;
  23. ELSE
  24.     SET limitTop = 3;
  25. END IF;
  26.  
  27.     SET @query = CONCAT("SELECT * FROM
  28. (SELECT * FROM bp_user_points b
  29. where points >= (SELECT points FROM bp_user_points b where userId = ",userId,"  limit 1)
  30. AND userId != ",userId," order by points desc limit ",limitTop,") T1
  31. UNION
  32. SELECT * FROM (SELECT * FROM bp_user_points b where userId = ",userId,") T2
  33. UNION
  34. SELECT * FROM
  35. (SELECT * FROM bp_user_points b
  36. where points <= (SELECT points FROM bp_user_points b where userId = ",userId,"  limit 1)
  37. AND userId != ",userId," order by points desc limit ",limitBottom,") T3;");
  38.  
  39.     PREPARE stmt FROM @query;
  40.     EXECUTE stmt;
  41.     DEALLOCATE PREPARE stmt;
  42.  
  43. END

El problema que estoy teniendo con esta consulta, es que por algun motivo los condicionales de arriba no funcionan como deberian o con la intension que tengo...

Esto basicamente lo que hace es contar cuantos registros tengo arriba mio y en caso que sean menor a 3 amplio la cantidad de registros que mostrare a abajo, y viceversa con los registros de abajo, de esta manera siempre mostraria 6 resultados sin importar en la posicion en la que estoy yo, si primero, ultimo o en el medio...

Como te mencionaba, parece no funcionar los condicionales, ya que por alguna razon me muestra mas resultados de los que supuestamente deberia limitar.

Gracias.

Best
C
__________________
Claudio A. Marrero - Proyect Manager