Ver Mensaje Individual
  #6 (permalink)  
Antiguo 28/10/2015, 09:19
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: Consulta para un ranking

Hola sdavila21:

Para entender en donde está el problema, debes recordar que la cláusula ORDER BY se ejecuta AL FINAL DE LA CONSULTA, es decir, primero se realizaría el SELECT con sus respectivos cálculos y al final la ordenación, es por eso que no coinciden los datos que quieres... Dado que el ranking depende en primer lugar del ORDEN, entonces DEBES FORZAR A QUE PRIMERO SE ORDENEN y después realizar la numeración para obtener el ranking, esto lo puedes hacer de distintas formas, la más simple es simplemente metiéndolo en una subconsulta. Checa este ejemplo:

Supongamos que tienes una tabla más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM mensajes;
  2. +------+-----------+
  3. | id   | usuario   |
  4. +------+-----------+
  5. |    1 | usuario A |
  6. |    2 | usuario A |
  7. |    3 | usuario B |
  8. |    4 | usuario B |
  9. |    5 | usuario B |
  10. |    6 | usuario B |
  11. |    7 | usuario C |
  12. |    8 | usuario C |
  13. |    9 | usuario C |
  14. +------+-----------+
  15. 9 rows in set (0.01 sec)

Para obtener el total de mensajes, simplemente haces un COUNT y ordenas por el campo calculado:

Código MySQL:
Ver original
  1. mysql> SELECT usuario, COUNT(usuario) total
  2.     -> FROM mensajes
  3.     -> GROUP BY usuario
  4.     -> ORDER BY total DESC;
  5. +-----------+-------+
  6. | usuario   | total |
  7. +-----------+-------+
  8. | usuario B |     4 |
  9. | usuario C |     3 |
  10. | usuario A |     2 |
  11. +-----------+-------+
  12. 3 rows in set (0.01 sec)

Ahora bien, este resultado es el que quieres numerar o "rankear", por lo tanto, lo pones como una SUBCONSULTA, para numerar los resultados ya ordenados. En otras palabras, haces algo como esto:

Código MySQL:
Ver original
  1. mysql> SET @rownum := 0;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT @rownum:=@rownum+1 rank, usuario, total
  5.     -> FROM
  6.     -> (  SELECT usuario, COUNT(usuario) total
  7.     ->    FROM mensajes
  8.     ->    GROUP BY usuario ORDER BY total DESC) T;
  9. +------+-----------+-------+
  10. | rank | usuario   | total |
  11. +------+-----------+-------+
  12. |    1 | usuario B |     4 |
  13. |    2 | usuario C |     3 |
  14. |    3 | usuario A |     2 |
  15. +------+-----------+-------+
  16. 3 rows in set (0.00 sec)

Se entiende donde estaba el problema??? haz la prueba y nos comentas.

Saludos
Leo.