Php 计算用户的排名
我想用MySQL计算排名。我有一张名为result的表格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 我想根
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跟踪对
“分区”的更改
- @报告跟踪
列中的更改“值”
- @如果重复
,则报告不会增加“值”
- @秩是计算出的稠密秩
列,例如测试id、考试id“分区”
- 以及
列,例如百分比“值”
- 比较当前行
与上一行“分区”
“分区”
- 如果
更改,则秩=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等)