Mam bardzo prostą tabelę MySQL, w której zapisuję najlepsze wyniki. Wygląda to tak:
Id Name Score
Jak na razie dobrze. Pytanie brzmi: jak uzyskać pozycję w rankingu użytkowników? Na przykład mam użytkowników Name
lub Id
chcę uzyskać jego rangę, gdzie wszystkie wiersze są uporządkowane porządkowo malejąco Score
.
Przykład
Id Name Score
1 Ida 100
2 Boo 58
3 Lala 88
4 Bash 102
5 Assem 99
W tym przypadku Assem
jego pozycja wynosiłaby 3, ponieważ otrzymał 3. najwyższy wynik.
Zapytanie powinno zwrócić jeden wiersz, który zawiera (tylko) wymaganą rangę.
(SELECT GROUP_CONCAT(score) FROM TheWholeTable)
nie jest najlepszym sposobem. Może to mieć problem z rozmiarem utworzonego wiersza.SELECT 1 + COUNT(*) AS rank FROM scores WHERE score > (SELECT score FROM scores WHERE name='Assem')
. Który „tylko” liczy liczbę wpisów z wyższym wynikiem niż bieżący. (Jeśli dodaszDISTINCT
, dostaniesz rangę bez luk ..)Gdy wiele zgłoszeń ma ten sam wynik, następna pozycja nie powinna być kolejna. Następna ranga powinna być zwiększana o liczbę wyników o tej samej randze.
Aby wyświetlić takie wyniki, wymagane są dwie zmienne rang
Oto bardziej stabilna wersja rankingu z powiązaniami:
Wypróbujmy to z przykładowymi danymi. Najpierw Oto przykładowe dane:
Załadujmy przykładowe dane
Następnie zainicjuj zmienne użytkownika:
Oto wynik zapytania:
Zwróć uwagę, jak wiele identyfikatorów o tym samym wyniku ma tę samą pozycję. Zauważ też, że ranga nie jest kolejna.
Spróbuj !!!
źródło
źródło
Jedną z opcji byłoby użycie zmiennych USER:
źródło
Odpowiedź Zaakceptowany ma potencjalny problem. Jeśli są dwa lub więcej identycznych wyników, w rankingu pojawią się luki. W tym zmodyfikowanym przykładzie:
Wynik 58 ma rangę 5, a nie ma rangi 4.
Jeśli chcesz się upewnić, że nie ma luk w rankingach, użyj
DISTINCT
w,GROUP_CONCAT
aby zbudować listę odrębnych wyników:Wynik:
Działa to również w celu uzyskania rangi pojedynczego użytkownika:
Wynik:
źródło
COUNT
zamiast niego podzapytania. Zobacz mój komentarz do zaakceptowanej odpowiedziOto najlepsza odpowiedź:
To zapytanie zwróci:
3)
źródło
To rozwiązanie daje
DENSE_RANK
w przypadku więzi:źródło
Czy poniższe czynności nie zadziałałyby (zakładając, że twoja tabela nazywa się Wyniki)?
źródło
Mam to, co daje takie same wyniki jak ten ze zmiennymi. Działa z więzami i może być szybszy:
Nie testowałem tego, ale używam takiego, który działa idealnie, który dostosowałem do tego ze zmiennymi, których tu używałeś.
źródło