2013-01-14 18 views
6

Ho una tabella in mySql che ha l'ID utente e i punteggi.SQL Trova posizione nella tabella

Quello che mi piacerebbe fare è organizzare la tabella in base ai punteggi (semplice), ma poi trovare dove un certo ID utente si trova nella tabella.

Finora avrei:

SELECT * FROM table_score 
ORDER BY Score DESC 

Come faccio a trovare dove userID = '1234' è (vale a dire l'ingresso 10 di 12)

+0

Verificare il seguente messaggio: http://stackoverflow.com/questions/3126972/mysql-row-number – Andy

risposta

10

La seguente query vi darà una nuova colonna UserRank, che specificano l'utente Classifica:

SELECT 
    UserID, 
    Score, 
    (@rownum := @rownum + 1) UserRank 
FROM table_score, (SELECT @rownum := 0) t 
ORDER BY Score DESC; 

SQL Fiddle Demo

Questo vi darà qualcosa di simile:

| USERID | SCORE | USERRANK | 
----------------------------- 
|  4 | 100 |  1 | 
|  10 | 70 |  2 | 
|  2 | 55 |  3 | 
| 1234 | 50 |  4 | 
|  1 | 36 |  5 | 
|  20 | 33 |  6 | 
|  8 | 25 |  7 | 

allora si può mettere questa query all'interno di una subquery e filtrare con un userId per ottenere che User Rank. Qualcosa di simile:

SELECT 
    t.UserRank 
FROM 
(
    SELECT *, (@rownum := @rownum + 1) UserRank 
    FROM table_score, (SELECT @rownum := 0) t 
    ORDER BY Score DESC 
) t 
WHERE userID = '1234'; 

SQL Fiddle Demo

+0

se si dispone di record con USERID duplicato come posso modificare questa query? grazie! –

2

Per un dato id utente, è possibile farlo con una semplice query:

select sum(case when ts.score >= thescore.score then 1 else 0 end) as NumAbove, 
     count(*) as Total 
from table_score ts cross join 
    (select ts.score from table_score ts where userId = '1234') thescore 

Se si dispone di indici su punteggio e userid, questo sarà abbastanza efficiente.

Problemi correlati