Ver Mensaje Individual
  #4 (permalink)  
Antiguo 18/09/2013, 19: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: Ranking de lista de usuarios

Este tema es parecido a uno tratado hace tiempo, y la solucion no pasa por ordenar, o armar búsquedas como lo planteas.
Si lo miras bien, lo que estás pidiendo una tabla como resultado de una consulta tal que:
1) Siempre tenga un valor dado en la cuarta posición.
2) Siempre tenga tres registros precedentes mayores al cuarto.
3) Siempre tenga dos registros posteriores, y menores al cuarto.

En principio, el planteo carece de sentido desde el momento en que en un sistema estadístico o de sumatorias, no puedes predecir que siempre habrá un conjunto de X registros antes o después, porque podría suceder que la suma de puntajes sea en uno, más de uno o todos, inferior o superior al valor dado de referencia (el cuarto).
Por ende, no puedes, a priori, predefinir que siempre habrá algo que lo preceda, o lo suceda.

Pero dejando de lado que no es racional el planteo, una consulta como la que quieres únicamente se puede construir en forma simple segmentando los rangos en diferentes consultas, y generando una respuesta única, con UNION:
Código MySQL:
Ver original
  1.       (SELECT U.userId Usuario, U.nicename , H.points
  2.       FROM users u INNER JOIN historypoints h ON U.user = H.userId = user
  3.       WHERE H.points > (SELECT points FROM historypoints WHERE userId = 4)
  4.       ORDER BY H.poits DESC
  5.       LIMIT 3) T1
  6. SELECT U.userId Usuario, U.nicename , H.points
  7. FROM users u INNER JOIN historypoints h ON U.user = H.userId = user
  8. WHERE H.userId = 4
  9.       (SELECT U.userId Usuario, U.nicename , H.points
  10.       FROM users u INNER JOIN historypoints h ON U.user = H.userId = user
  11.       WHERE H.points < (SELECT points FROM historypoints WHERE userId = 4)
  12.       ORDER BY H.userId
  13.       LIMIT 2) T2;
Si bien esto debería funcionar, no garantiza que obtengas realmente los tres registros superiores o los dos inferiores pedidos. Sólo que el valor de este usuario ID = 4 (que uso de ejemplo) aparezca siempre, como mucho, en la posicion 4 si la consulta devuelve hasta 6 registros.
El resto, no se puede asegurar, porque dependerá de los datos existentes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)