2016-09-09 3 views
0

はmysql-これらが一つのテーブルです:自己スコアで他の人に比べてランク付けなさい

mysql> SELECT * FROM test_member order by points asc; 
+-----------+---------+ 
| member_id | points | 
+-----------+---------+ 
|  34 | 1000 | 
|  22 | 2000 | 
|  33 | 2000 | 
|  35 | 3000 | 
+-----------+---------+ 

右の結果: 私のMEMBER_IDが「35」の場合、私のランクが「1」になり、

私のMEMBER_IDが '22' の場合、私のランクが '2' になり、私のMEMBER_IDが '33' の場合

することは、私のランクは '2' になり、

私のMEMBER_IDが '34' であり、私のランクは「3」、

....

などです。

試み - 1

SELECT * FROM (
SELECT member_id, 
      @points := @points + 1 AS rank 
FROM  test_member p, (SELECT @points := 0) r 
ORDER BY points DESC 
) t 
WHERE member_id='33'; 

+-----------+----------------------------------------+ 
| member_id | rank         | 
+-----------+------------+------+---------+----------+ 
|  33 | 3.000000000000000000000000000000  | 
+-----------+----------------------------------------+ 

試み - 2(のMySQL + PHPの方法)

<?php 
$simulation_ponits = 1000; 

$sql = ' 
    SELECT t.points, COUNT(*) as count_num 
    FROM test_member as t 
    WHERE t.points > ' . $simulation_ponits . ' 
    GROUP BY t.points 
    HAVING t.points > ' . $simulation_ponits .' 
'; 

$result = mysql_query($sql); 

$count_rank = 1; 
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 
    $count_rank +=$row['count_num']; 
} 


+--------+-----------+ 
| points | count_num | 
+--------+-----------+ 
| 2000 |   2 | 
| 3000 |   1 | 
+--------+-----------+ 


# $count_rank => 3 

両方試みが唯一のMySQL + PHPの方法であるが はIすることができ、正しい結果を示すことができます他の方法でこれをやろうとしましたか? ありがとうございます。

答えて

0

行番号ではなくランキングを取得しようとしています。以下の作業をする必要があります:

SELECT * FROM (
    SELECT member_id, 
      @rnk := @rnk + if (@prevPoints = points, 0, 
         if (@prevPoints := points, 1, 1)) as rnk 
    FROM  test_member p, (SELECT @rnk := 0, @prevPoints := null) r 
    ORDER BY points DESC 
) t 
WHERE member_id = 33 
+0

をはい、これは私が欲しいもの、感謝です。 – kkasp

関連する問題