Ver Mensaje Individual
  #6 (permalink)  
Antiguo 01/04/2013, 15:37
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Optimizar busqueda

Hola de nuevo:

En realidad eso de ordenar y buscar al jugador es irrelevante, lo que tienes que hacer como te dije es contar el número de jugadores que tienen más puntos que el jugador en cuestión... Si observas el segundo ejemplo que pongo es justo lo que necesitas, presentando la información en forma de columnas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM juegos;
  2. +------+--------+----------+---------+
  3. | id   | nombre | pcanicas | pcartas |
  4. +------+--------+----------+---------+
  5. |    1 | juan   |      154 |     521 |
  6. |    2 | marcos |      378 |     378 |
  7. |    4 | silvia |      487 |     554 |
  8. |    5 | anna   |       55 |      14 |
  9. +------+--------+----------+---------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT id, nombre,
  13.     -> ( SELECT COUNT(DISTINCT id) FROM juegos T2
  14.     ->   WHERE T2.pcanicas >= T1.pcanicas) rank_canicas,
  15.     -> ( SELECT COUNT(DISTINCT id) FROM juegos T2
  16.     ->   WHERE T2.pcartas >= T1.pcartas) rank_cartas
  17.     ->   FROM juegos T1
  18.     -> WHERE T1.nombre = 'juan';
  19. +------+--------+--------------+--------------+
  20. | id   | nombre | rank_canicas | rank_cartas   |
  21. +------+--------+--------------+--------------+
  22. |    1 | juan   |            3 |            2 |
  23. +------+--------+--------------+--------------+
  24. 1 row in set (0.00 sec)

Mucho ojo, en tu post pones en el rank de cartas como primero, sin embargo silvia tiene más puntos que juan... supongo que se trata simplemente de un error de dedo.

Ahora bien, también podrías obtener el resultado en forma de renglones, aunque la consulta es un poco más complicada.

Código MySQL:
Ver original
  1. mysql> SELECT "canicas", COUNT(DISTINCT id)
  2.     -> FROM juegos
  3.     -> WHERE pcanicas >= (SELECT pcanicas
  4.     ->                    FROM juegos
  5.     ->                    WHERE nombre = 'juan')
  6.     -> UNION
  7.     -> SELECT "cartas", COUNT(DISTINCT id)
  8.     -> FROM juegos
  9.     -> WHERE pcartas >= (SELECT pcartas
  10.     ->                    FROM juegos
  11.     ->                    WHERE nombre = 'juan');
  12. +---------+--------------------+
  13. | canicas | COUNT(DISTINCT id) |
  14. +---------+--------------------+
  15. | canicas |                  3 |
  16. | cartas  |                  2 |
  17. +---------+--------------------+
  18. 2 rows in set (0.00 sec)

Ambas consultas son bastante ineficientes por cierto, pero eso se debe a que desde mi punto de vista tienes un pésimo modelo de datos, pero bueno, puedes hacer la prueba para ver qué tanto se tardan en ejecutar estas consultas, o como lo planteas hacer cada consulta por separado, pero olvídate de eso de ordenar y buscar... simplemente cuenta el numero de jugadores con mayor puntuación.

Saludos
Leo.