-Sorgu mySQL "Skor Derece"

1 Cevap php

, Dünya çapında orada kodlayıcılar Hi

Kullanıcıların bazı şeyleri yapmak ve bunun için puan kazanmak bir proje üzerinde çalışıyorum. Bu soruyu basitleştirmek için en biz 2 tablolar user var ve points diyelim.

-- 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        |
                     +-----------------------------+

Şimdi tam puanlar listesini elde etmek ben aşağıdaki sorguyu kullanın

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

İlk geçen tüm kullanıcılar ile ince yüksek puanlar listesinde sonuçlanan

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

Geri soruya kendisi Alright. Tek bir kullanıcının profilinin ben yüksek puanlar listesine içinde onun sıralamasını göstermek istiyorum.

Bu sadece, örneğin Tom (id=2) yerine 3 sıralanır olduğunu gösteren tek bir sorgu kullanarak yapılabilir mi?

Teşekkürler :-) alot

1 Cevap

Fikir "@ this_user yukarıda rütbe kaç oyuncu", sormaktır:

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)

Edited sonucu yapmak yerine 0-tabanlı 1-tabanlı