【问题标题】:PHP Calculate rank from databasePHP从数据库中计算排名
【发布时间】:2014-08-14 17:31:03
【问题描述】:

我有一个小问题,我有一个数据库,在那个数据库中有不同的名字、id 和硬币。我想向人们展示他们的排名,所以如果你的硬币最多,你的排名必须是 1,如果你的数字 78172 有硬币,你的排名必须是 78172。

我知道我可以这样做:

SELECT  `naam` ,  `coins` 
FROM  `gebruikers` 
ORDER BY  `coins` DESC 

但是我怎样才能得到你的排名,在 PHP :S 中?

【问题讨论】:

    标签: php mysql database


    【解决方案1】:

    您可以使用循环和计数器。 MySql 的第一行排名第一,即列表中的第一。

    【讨论】:

      【解决方案2】:

      我想你想要这样的东西:

      第一名 - John Doe 第二名——简·多伊 .. ..

      对吗?

      见:http://www.if-not-true-then-false.com/2010/php-1st-2nd-3rd-4th-5th-6th-php-add-ordinal-number-suffix

      不久前帮助过我。

      【讨论】:

        【解决方案3】:

        你可以使用一个新的变量

        $i = "1";
        

        pe care o poti folosi in structura ta foreach,while,for,repeat si o incrementezi mereu。 你可以在 foreach,while,for,repeat 和 increment it 这样的结构中使用它

        $i++;
        

        这是最简单的方法

        【讨论】:

          【解决方案4】:

          上面没有代码示例...所以这里是 PHP

          // Your SQL query above, with limits, in this case it starts from the 11th ranking (0 is the starting index) up to the 20th
          $start = 10; // 0-based index
          $page_size = 10;
          $stmt = $pdo->query("SELECT  `naam` ,  `coins` FROM  `gebruikers`  ORDER BY  `coins` DESC LIMIT {$start}, {$page_size}");
          
          $data = $stmt->fetchAll();
          
          // In your template or whatever you use to output
          foreach ($data as $rank => $row) {
              // array index is 0-based, so add 1 and where you wanted to started to get rank
              echo ($rank + 1 + $start) . ": {$row['naam']}<br />";
          }
          

          注意:我懒得放入prepared statement,但是请查一下并使用prepared statements。

          【讨论】:

            【解决方案5】:

            如果您有一个会话表,您可以从中提取记录,然后使用这些值来获取硬币值,然后降序排序。

            如果我们假设您的 Session 表是 sessions(session_id int not null auto_increment, user_id int not null, session_time,...) 并且我们假设只有登录的用户才有会话值,那么您的 SQL 将如下所示:(注意:我假设您也有一个 user_id gebruikers 表上的列)

            SELECT  g.*
            FROM  gebruikers as g, sessions as s WHERE s.user_id = g.user_id 
            ORDER BY  g.coins DESC 
            

            然后,您将使用行迭代器循环遍历结果并显示“1”、“2”、“3”等。其简短版本如下所示

            //Connect to database using whatever method you like, I will assume mysql_connect()
            $sql = "SELECT  g.* FROM  gebruikers as g, sessions as s WHERE s.user_id = g.user_id ORDER BY  g.coins DESC";
            $result = mysql_query($sql,$con); //Where $con is your mysql_connect() variable;
            $i = 0;
            while($row = mysql_fetch_assoc($result,$con)){
                $row['rank'] = $i;
                $i++;
                //Whatever else you need to do;
            }
            

            编辑

            http://sqlfiddle.com/#!2/8faa9/6 找到一个 SQLFiddle

            我遇到了一些在那里工作的东西;我不知道在 php 中给出时它是否会起作用,但我想我会以任何一种方式向你展示它

            SET @rank = 0; SELECT *,(@rank := @rank+1) as rank FROM something order by coins DESC

            编辑 2

            这适用于来自文件的 php 查询。

            SELECT @rank:=@rank as rank,
                g.*
            FROM
                (SELECT @rank:=0) as z,
                gebruikers as g
                ORDER BY coins DESC
            

            【讨论】:

              【解决方案6】:

              如果你想获得一个特定用户的排名,你可以直接在 mysql 中通过计算你想要排名的用户拥有更多硬币的用户数量来实现:

              SELECT COUNT(*)
              FROM  `gebruikers`
              WHERE `coins` > (SELECT `coins` FROM `gebruikers` WHERE `naam` = :some_name)
              

              (假设按名称搜索)

              现在排名将是返回的计数 + 1。

              或者你在mysql中做SELECT COUNT(*) + 1...

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-04-15
                • 1970-01-01
                • 2011-06-18
                • 2013-11-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-04
                相关资源
                最近更新 更多