2010-01-28 8 views
5

Tengo una tabla llamada 'puntuaciones más altas' que se parece a esto.Mostrando un solo rango en la tabla 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 

Dado un udid específico, quiero devolver el rango de esa fila por su valor de puntaje.

es decir, si UDID da = 0000, que debería volver 5.

Cualquier idea de cómo escribir esta consulta de una base de datos MySQL?

Respuesta

7

MySQL no tiene ninguna funcionalidad analítica/rango, pero se puede utilizar una variable para crear artificialmente un valor rango:

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 

Con el fin de ver qué rango se asocia con UDID "0000", el uso :

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' 

necesitan la MAX de si el usuario tiene múltiples valores de puntuación más alta. Alternativamente, no puede usar MAX y usar ORDER BY rank LIMIT 1.

+0

ahh gracias, sólo hay 1 entrada por udid, me ocupo de eso en mi script php. también, estoy un poco enterado de esto. Entonces, ¿cómo funcionan los dos bloques juntos? ¿Los puse en la misma consulta? ¿O derecho uno después del otro? –

+0

@MichaelInno: si solo está buscando el rango de usuarios específicos, solo necesita usar la segunda consulta. Reemplaza el ''0000'' con el' 'udid' que estés buscando. –

+0

Esto le dará diferentes rangos para los usuarios con el mismo puntaje. –

1

Reiterar excelente respuesta de OMG, que es el caso general de múltiples puntuaciones más altas por UDID, aquí está la consulta basada en la condición previa de exactamente una entrada por 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'