Php 计算用户的排名

Php 计算用户的排名,php,mysql,sql,codeigniter,ranking,Php,Mysql,Sql,Codeigniter,Ranking,我想用MySQL计算排名。我有一张名为result的表格 result_id test_id exam_id user_id percentage 1 5 6 50 57 2 5 6 58 76 3 5 6 65 42 我想根

我想用MySQL计算排名。我有一张名为result的表格

result_id    test_id    exam_id    user_id    percentage
   1            5          6          50          57
   2            5          6          58          76 
   3            5          6          65          42
我想根据用户的用户id计算用户的排名,并测试用户id,比如用户id(58)有1个排名用户id(50)有2个,以此类推

我试过这样问

select percentage  from result where test_id=$test_id(i.e 5) and user_id=$user_id(i.e 58)
但它给出了76,没有给出排名

我也试过了

select percentage from result where test_id=$test_id(i.e 5) 
但它给了我57,76,42


有什么方法可以计算用户的排名吗?

您可以简单地使用
按百分比排序DESC
。试试这个

$con = mysqli_connect("host","user","password","db_name");
if (mysqli_connect_errno()){
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql = 'SELECT * FROM result ORDER BY percentage DESC';
$result = mysqli_query( $con, $sql );
if (!mysqli_query($con, $sql)) {
    die('Error: '. mysqli_error($con));
}
$i = 1;
while($row = mysqli_fetch_array($result)) {
    echo 'User ID ' . $row['user_id'] . ' has rank  ' . $i . ' and percentage ' . $row['percentage'] . '</br>';
    $i++;
}
mysql_close($con);
$con=mysqli_connect(“主机”、“用户”、“密码”、“数据库名称”);
if(mysqli\u connect\u errno()){
echo“未能连接到MySQL:”.mysqli_connect_error();
}
$sql='按百分比描述从结果顺序中选择*';
$result=mysqli\u查询($con,$sql);
如果(!mysqli_query($con,$sql)){
die('Error:'.mysqli_Error($con));
}
$i=1;
while($row=mysqli\u fetch\u数组($result)){
回显“用户ID”。$row['User_ID']”具有等级“$i.”和百分比“$row['percentage']”。
; $i++; } mysql_close($con);
您可以在MySQL中执行此操作,而无需返回所有结果。对于单个用户:

select percentage
       (select count(*)
        from result r2
        where test_id = r.test_id and r2.percentage > r.percentage
       ) + 1 as rank
from result r
where test_id=$test_id(i.e 5) and user_id=$user_id(i.e 58

您可以使用变量来计算一个表的DenseRank,我假设对于test\u id和test\u id的每个组合(我将其视为
“partition”
字段),这个排名将从1重新开始,对于这个查询,我们将使用
“value”
来确定排名是百分比(按降序排列);因此,最高百分比的排名为1

像这样:

set @patn = '';
set @rank = 1;
set @valu = '';
set @rept = 1;

SELECT    test_id
        , exam_id
        , user_id
        , percentage
        , DenseRank
FROM (
      SELECT  test_id
            , exam_id
            , user_id
            , percentage
            , @rank := if(@patn=grp, if(@valu=percentage, @rank, @rank + @rept),1) as DenseRank
            , @rept := if(@patn=grp, if(@valu=percentage, @rept, 1),1)
            , @patn := grp
            , @valu := percentage     
      FROM  (
             select
                      concat(test_id,exam_id) AS grp
                    , test_id
                    , exam_id
                    , user_id
                    , percentage
              from results 
              order by
                      test_id
                    , exam_id
                    , percentage DESC
            ) dta
     ) dtb;
  • @patn跟踪对
    “分区”的更改
  • @报告跟踪
    “值”
    列中的更改
  • @如果重复
    “值”
    ,则报告不会增加
  • @秩是计算出的稠密秩
内部查询(dta)必须按以下顺序排序:

  • “分区”
    列,例如测试id、考试id
  • 以及
    “值”
    列,例如百分比
下一级外部查询(dtb)

  • 比较当前行
    “分区”
    与上一行
    “分区”
  • 如果
    “分区”
    更改,则秩=1
  • 否则,将前一行
    “值”
    与当前行
    “值”
  • 如果
    “值”
    发生变化,则将秩增加1
  • 否则,将分配相同的等级
  • 存储当前的
    “分区”
    ;被认为是上一个
    下一行的“分区”
  • 存储当前的
    “值”
    ;被认为是上一个
    下一行的“值”
最后:

  • 选择所需的列
稍微扩展示例数据这是一个结果:

| TEST_ID | EXAM_ID | USER_ID | PERCENTAGE | DENSERANK |
|---------|---------|---------|------------|-----------|
|       5 |       6 |     580 |         76 |         1 |
|       5 |       6 |      50 |         57 |         2 |
|       5 |       6 |     581 |         57 |         2 |
|       5 |       6 |     582 |         57 |         2 |
|       5 |       6 |     583 |         42 |         3 |
|       5 |       6 |      65 |         42 |         3 |

|       6 |       6 |     580 |         76 |         1 |
其中排名计算只应增加1(因此称为“密集”),并在下一个“分区”中以1重新开始

注意:
partition
一词暗指数据库管理系统中使用的
partitionby
,该系统具有排名分析功能(Oracle、DB2、SQL Server、PostGres等)