100 votos

Con MySQL, ¿cómo puedo generar una columna que contiene el índice de registro en una tabla?

¿Hay alguna manera de conseguir el actual número de fila de una consulta?

Quiero ser capaz de ordenar una tabla llamada league_girl por un campo denominado puntuación; y devolver el nombre de usuario y la fila real de la posición de ese nombre de usuario.

Estoy queriendo clasificar a los usuarios de manera que puede decir de donde un usuario particular, es decir,. Joe es la posición 100 de 200, es decir,

User Score Row
Joe  100    1
Bob  50     2
Bill 10     3

Yo he visto un par de soluciones en aquí, pero he probado la mayoría de ellos y ninguno de ellos en realidad devolver el número de fila.

He intentado esto:

SELECT position, username, score
FROM (SELECT @row := @row + 1 AS position, username, score 
       FROM league_girl GROUP BY username ORDER BY score DESC) 

Como se deriva

...pero no parecen volver a la posición de fila.

Alguna idea?

174voto

Daniel Vassallo Puntos 142049

Quizá quieras probar lo siguiente:

SELECT  l.position, 
        l.username, 
        l.score,
        @curRow := @curRow + 1 AS row_number
FROM    league_girl l
JOIN    (SELECT @curRow := 0) r;

El JOIN (SELECT @curRow := 0) parte permite la inicialización de la variable sin necesidad de un separado SET comando.

Caso de prueba:

CREATE TABLE league_girl (position int, username varchar(10), score int);
INSERT INTO league_girl VALUES (1, 'a', 10);
INSERT INTO league_girl VALUES (2, 'b', 25);
INSERT INTO league_girl VALUES (3, 'c', 75);
INSERT INTO league_girl VALUES (4, 'd', 25);
INSERT INTO league_girl VALUES (5, 'e', 55);
INSERT INTO league_girl VALUES (6, 'f', 80);
INSERT INTO league_girl VALUES (7, 'g', 15);

Consulta de prueba:

SELECT  l.position, 
        l.username, 
        l.score,
        @curRow := @curRow + 1 AS row_number
FROM    league_girl l
JOIN    (SELECT @curRow := 0) r
WHERE   l.score > 50;

Resultado:

+----------+----------+-------+------------+
| position | username | score | row_number |
+----------+----------+-------+------------+
|        3 | c        |    75 |          1 |
|        5 | e        |    55 |          2 |
|        6 | f        |    80 |          3 |
+----------+----------+-------+------------+
3 rows in set (0.00 sec)

38voto

Peter Johnson Puntos 1156
SELECT @i:=@i+1 AS iterator, t.*
FROM tablename t,(SELECT @i:=0) foo

4voto

Hearth Puntos 33

También se puede utilizar

SELECT @curRow := ifnull(@curRow,0) + 1 Row, ...

al inicializar la variable contador.

3voto

ftzdomino Puntos 61

Suponiendo que MySQL soporta, puede fácilmente hacer esto con una subconsulta estándar de SQL:

select 
    (count(*) from league_girl l1 where l2.score > l1.score and l1.id <> l2.id) as position,
    username,
    score
from league_girl l2
order by score;

Para grandes cantidades de resultados mostrados, esto será un poco lento y desea cambiar a una combinación del uno mismo en su lugar.

3voto

Heryno Puntos 1

Si sólo quieres conocer la posición de un usuario concreto después de la orden por puntuación de campo, simplemente puede seleccionar fila todo desde su mesa donde campo puntuación es superior a la puntuación actual del usuario. Y utilice el número de filas devuelto + 1 saber qué posición de este usuario actual.

Suponiendo que la tabla es "league_girl" y su especialidad es el "id", puede utilizar esto:

SELECT count(id) + 1 as rank from league_girl where score > <your_user_score>

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X