2010-01-22 3 views
3

Hi there codeurs dans le monde,mySQL « Rang dans Highscore » -query

Je travaille sur un projet où les utilisateurs peuvent faire certaines choses et les points de gain pour elle. Pour simplifier cette question disons que nous avons 2 tables utilisateur et points.

-- table user  -- table points 
+---------------+ +-----------------------------+ 
| id | name | | id | points | user_id | 
+---------------+ +-----------------------------+ 
| 1  Tim | | 1  5   1  | 
| 2  Tom | | 2  10   1  | 
| 3  Marc | | 3  5   1  | 
| 4  Tina | | 4  12   2  | 
| 5  Lutz | | 5  2   2  | 
+---------------+ | 6  7   1  | 
        | 7  40   3  | 
        | 8  100  1  | 
        +-----------------------------+ 

Maintenant, pour obtenir les meilleurs scores liste complète J'utilise la requête suivante

SELECT u.*, SUM(p.points) AS sum_points 
FROM user u 
LEFT JOIN points p ON p.user_id = u.id 
GROUP BY u.id 
ORDER BY sum_points DESC 

entraînant une amende liste des meilleurs scores avec tous les utilisateurs du premier au dernier

+------------------------------+ 
| id | name | sum_points | 
+------------------------------+ 
| 1  Tim  127   | 
| 3  Marc  40   | 
| 2  Tom  14   | 
| 4  Tina  0   | 
| 5  Lutz  0   | 
+------------------------------+ 

Bon retour à la question elle-même. Sur le profil d'un seul utilisateur, j'aimerais montrer son classement dans la liste des meilleurs scores. Est-ce que cela peut être fait en utilisant une seule requête montrant que par exemple Tom (id = 2) est classé à la place 3?

Merci beaucoup :-)

Répondre

4

L'idée est de demander "combien de joueurs se classent au-dessus @this_user":

select count(*) + 1 from 
(
    /* list of all users */ 
    SELECT SUM(p.points) AS sum_points 
    FROM user u 
    LEFT JOIN points p ON p.user_id = u.id 
    GROUP BY u.id   
) x 
/* just count the ones with higher sum_points */ 
where sum_points > (select sum(points) from points where user_id = @this_user) 

Edité faire 1 résultat-fondé au lieu de 0-based

+1

+1, c'est ce que Je voulais, mais vous l'avez eu en premier. Une chose à noter - pour obtenir la place de l'utilisateur ce serait count (*) + 1 (comme vous l'avez dit cela n'obtiendra que le nombre d'utilisateurs avec des scores plus élevés que @this_user). – rosscj2533

+0

@ rosscj2533: merci, corrigé. – egrunin

1
SELECT q.*, 
     @r := @r + 1 AS rank 
FROM (
     SELECT @r := 0 
     ) vars, 
     (
     SELECT u.*, 
       SUM(p.points) AS sum_points 
     FROM 
       user u 
     LEFT JOIN 
       points p 
     ON  p.user_id = u.id 
     GROUP BY 
       u.id 
     ORDER BY 
       sum_points DESC 
     ) q 
+0

Ce n'est pas exactement ce que j'ai demandé, mais aussi vraiment utile :) – Flatlin3

+0

'@ Tim': oh, désolé, je l'ai maintenant :) – Quassnoi