2013-01-14 15 views
6

Mam tabelę w mySql, która ma identyfikator użytkownika i wyniki.SQL Znajdź pozycję w tabeli

Co chciałbym zrobić, to uporządkować tabelę według wyników (proste), ale następnie sprawdzić, gdzie w tabeli znajduje się określony identyfikator użytkownika.

Dotychczas musiałbym:

SELECT * FROM table_score 
ORDER BY Score DESC 

Jak znajdę gdzie userID = '1234' jest (czyli pozycja 10 z 12)

+0

Zamówienie na następujący wpis: http://stackoverflow.com/questions/3126972/mysql-row-number – Andy

Odpowiedz

10

Poniższe zapytanie daje nową kolumnę UserRank, które określają użytkownikowi rank:

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

SQL Fiddle Demo

To daje coś takiego:

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

Następnie można umieścić to zapytanie wewnątrz podzapytania oraz filtr z userId aby tego użytkownika rangę. Coś jak:

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

jeśli masz rekordy z duplikatem USERID, jak mogę edytować to zapytanie? podziękować! –

2

Dla danego identyfikatora użytkownika, można to zrobić za pomocą prostego zapytania:

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 

Jeśli masz indeksy na wynik i identyfikatora użytkownika, będzie to całkiem wydajny.

Powiązane problemy