Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Consulta para un ranking

Estas en el tema de Consulta para un ranking en el foro de Mysql en Foros del Web. Hola buenas, llevo 3 días intentando sacar una consulta y no doy con la tecla, me explico : Tengo dos tablas : usuarios y mensajes ...
  #1 (permalink)  
Antiguo 28/10/2015, 06:42
 
Fecha de Ingreso: febrero-2011
Mensajes: 67
Antigüedad: 13 años, 2 meses
Puntos: 0
Consulta para un ranking

Hola buenas,
llevo 3 días intentando sacar una consulta y no doy con la tecla, me explico :

Tengo dos tablas : usuarios y mensajes

usuarios tiene estos campos : iduser,usuario,password,nombre,apellidos
mensajes tienes : idmensaje,fechahora,emisor(id numero de usuario),receptor(id numero de usuario),texto

Lo que yo necesito es sacar los usuarios con mas mensajes y tener una columna con la posición del ranking. Es decir yo tengo Usuario A (2 mensajes),Usuario B(1) y Usuario C (3).

Necesito hacer una consulta que me muestre algo como esto:

1 - Usuario C - 3 Mensajes
2 - Usuario A - 2 Mensajes
3 - Usuario B - 1 Mensaje

Tengo esta consulta :
[
Código MySQL:
Ver original
  1. select  @curRank := @curRank + 1 AS rank,u.usuario,count(emisor) as cantidad from (SELECT @curRank := 0) r,mensaje
  2. inner join usuario u on mensaje.emisor=u.iduser
  3. group by emisor ORDER BY cantidad DESC;

Pero lo que me duelve es:

3 - Usuario C - 3
1 - Usuario A - 2
2 - Usuario B - 1

La primera columna realmente es el id del usuario de la tabla usuario pero no es el del ranking.

Espero haberme explicado y que alguien pueda ayudarme.

Un saludo y gracias
  #2 (permalink)  
Antiguo 28/10/2015, 06:47
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta para un ranking

Lo que te devuelve es correcto, dado que estas ordenando en forma descendente, por las cantidades.
¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 28/10/2015, 06:52
 
Fecha de Ingreso: febrero-2011
Mensajes: 67
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Consulta para un ranking

Hola,
Pero lo que necesito que me devuelva es :

1 - Usuario C - 3
2 - Usuario A - 2
3 - Usuario B - 1

¿Como puedo hacerlo?

Gracias por la ayuda
  #4 (permalink)  
Antiguo 28/10/2015, 07:12
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta para un ranking

Pues es medio obvio, lo ordenas por la columna 1...

Código MySQL:
Ver original 
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 28/10/2015, 07:45
 
Fecha de Ingreso: febrero-2011
Mensajes: 67
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Consulta para un ranking

Creo que no nos estamos entendiendo. Necesito que me ordene por los que tienen mas mensajes y una vez tengo eso el que mas tiene tiene que ser el 1 en el ranking no el 3 como me muestra actualmente.

Ahora :

3 - Usuario C - 3
1 - Usuario A - 2
2 - Usuario B - 1

Lo que necesito :

1 - Usuario C - 3
2 - Usuario A - 2
3 - Usuario B - 1

Espero haberme explicado porque muy bien no se me da.

Gracias
  #6 (permalink)  
Antiguo 28/10/2015, 09:19
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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.
  #7 (permalink)  
Antiguo 28/10/2015, 11:32
 
Fecha de Ingreso: febrero-2011
Mensajes: 67
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Consulta para un ranking

Ostras la verdad que es perfecto. Ahora si me funciona.
La otra duda es yo una vez tengo esto, como puedo indicar que posicion tiene el usuario con id 1 por ejemplo.
En este caso lo tengo en la tabla usuarios y los mensajes en otra donde emisor y receptor son fk de usuarios.

Gracias por la ayuda.
  #8 (permalink)  
Antiguo 28/10/2015, 15:56
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta para un ranking

Necesitas obtener el ID del usuario en cuestión junto con el ranking y la suma total de cada uno.
La posición del ranking te permitirá acceder al ID en la tabla resultado.
El ranking no es útil para identificar al usuario si no es en un momento dado del tiempo. Por eso necesitas al mismo tiempo su ID.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, fecha, join, ranking, select, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:24.