2010-01-28 14 views
5

Mam tabelę o nazwie "rekordy", która wygląda tak.Wyświetlanie pojedynczej pozycji w tabeli MySQL

id  udid  name  score 
1  1111  Mike  200 
2  3333  Joe  300 
3  4444  Billy  50 
4  0000  Loser  10 
5  DDDD  Face  400 

Biorąc pod uwagę konkretny udid, chcę zwrócić pozycję tego rzędu według wartości wynikowej.

tj jeśli UDID podane = 0000, powinienem wrócić 5.

pojęcia jak napisać zapytanie do bazy danych MySQL?

Odpowiedz

7

MySQL nie posiada żadnych funkcji analitycznej/ranking, ale można użyć zmiennej aby sztucznie stworzyć wartość rank:

SELECT t.id, 
     t.udid, 
     t.name, 
     t.score, 
     @rownum := @rownum + 1 AS rank 
    FROM HIGHSCORES t 
    JOIN (SELECT @rownum := 0) r 
ORDER BY t.score DESC 

Aby zobaczyć, co jest związane z Ranking UDID „0000”, użytkowania :

SELECT MAX(x.rank) AS rank 
    FROM (SELECT t.id, 
       t.udid, 
       t.name, 
       t.score, 
       @rownum := @rownum + 1 AS rank 
      FROM HIGHSCORES t 
      JOIN (SELECT @rownum := 0) r 
     ORDER BY t.score DESC) x 
WHERE x.udid = '0000' 

Potrzebujesz MAX, jeśli użytkownik ma wiele wartości o wysokim wyniku. Ewentualnie nie możesz użyć MAX i użyć ORDER BY rank LIMIT 1.

+0

ahh dzięki, jest tylko 1 wpis za udid, zajmuję się tym w moim php script. także, jestem trochę wiedziałem do tego. Więc jak działają te dwa bloki. Czy umieszczam je w tym samym zapytaniu? Lub zaraz po sobie? –

+0

@MichaelInno: Jeśli sprawdzasz tylko dla określonej pozycji użytkownika, musisz użyć tylko drugiego zapytania. Zamień "0000" na "poszukiwany", którego szukasz. –

+0

To da ci różne stopnie dla użytkowników z tym samym wynikiem. –

1

Aby podkreślić doskonałą odpowiedź OMG, która jest ogólnie przypadku wielu wysoką ocenę na UDID, tutaj jest kwerenda w oparciu o warunek wstępny dokładnie jednej pozycji na UDID:

SELECT rank 
FROM 
    (SELECT @rownum := @rownum + 1 AS rank, score, udid 
    FROM highscores 
    JOIN (SELECT @rownum := 0) r 
    ORDER BY highscores.score DESC) x 
WHERE x.udid = '0000' 
Powiązane problemy