2

次のように設定された「member_points」というテーブルがあります。

|----|-------|----------|------------------------|
| id |  uid  |  points  |  last_loggedin         |
|----|-------|----------|------------------------|
| 1  |  1    |  5075    |  2012-08-02 02:04:00   |
|----|-------|----------|------------------------|
| 2  |  2    |  2026    |  2012-08-04 02:15:02   |
|----|-------|----------|------------------------|

私は以下の機能を持っています。行「ポイント」の数に基づいて、「ランク1」または「ランク2」のようにランクをエコーまたは返す関数が必要です。

function getTopRanks($id) {  
   $sql = "SELECT MAX(points) AS toppoints FROM member_points";
   $r = mysql_query($sql);
   if ( $r !== false && mysql_num_rows($r) > 0 ) {
      while ( $a = mysql_fetch_assoc($r) ) {
          $points = stripslashes($a['toppoints']);
          return ''.$points.'';  
      }
   }
}

誰かがこれを可能にするのを手伝ってくれますか?

4

3 に答える 3

3

ポイントに基づいてユーザーをランク付けしようとしていると思います。このようなタイプの問題については、ユーザーDESC順で1 位にすることをお勧めします。次に、希望値フォーム行をピックアップします。

function getTopRanks($id) {

   $sql = "SELECT uid FROM member_points ORDER BY points DESC ";
   $r = mysql_query($sql);
   if ( $r !== false && mysql_num_rows($r) > 0 ) {
      while ( $a = mysql_fetch_assoc($r) ) {
         $points = stripslashes($a['toppoints']);

           return ''.$points.'';

     }
   }

 }

これはあなたの問題を解決します.:)

あなたの要件として更新:

function getTopRanksUser($id) {
$userPos ="Ranked position is:";
  $count = 0;
  $sql = "SELECT uid FROM member_points ORDER BY points DESC ";
  $r = mysql_query($sql);
  if ( $r !== false && mysql_num_rows($r) > 0 ) {
    while ( $a = mysql_fetch_assoc($r) ) {
       $count = $count+1;
       $userPosCount = $userPos+$count;

       return $userPosCount;

  }
 }

}

userPos+count が返されるはずです。カウントはテーブル内の行数を増やし、文字列のランク付け位置は常に同じであるためです。これにより結果が得られます。要件に応じて戻り文字列を変更できます。:) ありがとう。

于 2012-08-04T18:52:55.540 に答える
3

mysql クエリで ORDER BY (http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html) を使用します。

あなたのクエリは

SELECT points FROM member_points ORDER BY points DESC

これにより、クエリの結果がポイント数で並べ替えられます。(DESC はそれらを降順にし、ASC は結果を昇順にします)。

于 2012-08-04T18:46:44.170 に答える
0

ランキングに使用するものは次のとおりです...このコードも同点を考慮して正しく表示されます。"username" と "points" を db の適切な列名に変更し、db 接続変数を設定します: $hostName $databaseNanme $username と $password を接続します。

お役に立てれば!

    $sql1 = "SET @rnk=0; SET @rank=0; SET @scount=0;";
    $sql2 = "SELECT username, points, rank FROM
    (
        SELECT AA.*,BB.username, points
        (@rnk:=@rnk+1) rnk,
        (@rank:=IF(@scount=points,@rank,@rnk)) rank,
        (@scount:=points) newscount
        FROM
        (
            SELECT * FROM
            (SELECT COUNT(1) scorecount,points
            FROM users GROUP BY points
        ) AAA
        ORDER BY points DESC
    ) AA LEFT JOIN users BB USING (points)) A;";

try {
    $conn = new PDO('mysql:host='.$hostName.';dbname='.$databaseName, $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $conn->query($sql1);
    $data = $conn->query($sql2);

    $standings = $data->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    error_log( 'ERROR: ' . $e->getMessage() );
}

print_r($順位);

于 2013-09-12T18:48:35.363 に答える