繁体   English   中英

带有关系的排名并跳过某些行,其中mysql中没有满足一个条件

[英]Ranking with ties and skipping certain rows where one condition is not met in mysql

我从昨天开始谷歌搜索我怎么能这样做,但没有用。 我可以使用php和mysql问题完美地实现关系排名并返回特定学生的排名。 但我有一个问题。 问题是,如果一个学生在一个科目中失败(通过标记被给出33)在表格中按主题(可用的不同科目)分组,我想跳过使用mysql计算他的排名。

$query = "SELECT id, Names, 
TOTALSCORE, Rank
FROM(
(SELECT t.*, IF(@p = TOTALSCORE, @n, @n := @n + 1)  
AS Rank, @p := TOTALSCORE
FROM(
(SELECT id, Names,
SUM(score) TOTALSCORE
FROM exam, (SELECT @n := 0, @p := 0) n
GROUP BY id
ORDER BY TOTALSCORE DESC
) t
) r";
$myrank = mysql_query($query, $dbconnect) or die(mysql_error());        
$i = 0;
$j = 0;
$data = array();
while($row_myrank = mysql_fetch_assoc($myrank)){
$data[$i] = $row_myrank;
if(isset($data[$i - 1]) && $data[$i - 1]['TOTALSCORE'] == $data[$i]['TOTALSCORE']){
$data[$i]['Rank'] = $j;
}else{
$data[$i]['Rank'] = ++$j;
    }
$i++;
}
foreach($data as $key => $value){
 if($value['id'] == $id){
   if($value['Rank']>0){
   return $value['Rank'];
  } else{
       return "<font color=red>Not get Ranking.</font>";
 }
}
} 

这是我想要实现的样本镜头。 在这个镜头中,我只有三个不同的学生,在应用程序中我可能有超过300个不同的学生。 学生失败的主题标记为红色。 排行

我不太确定“ pass mark is given 33pass mark is given 33什么意思。

我认为它是Fullmark 33%,
例如,如果Fullmark = 75,则通过分数为75 = 24,75分的33%,
这意味着学生必须获得至少24,75分才能通过考试。

在这种情况下,使用反连接进行简单检查可以帮助:

WHERE NOT EXISTS(
  SELECT null FROM exam e
  WHERE e.id = r.id
    AND e.score/e.Fullmark < 0.33
);

上述方法是:“只给我这些记录,其中不存在任何考试,其中的成绩<33%”

完整查询如下所示,此处有一个演示 - > http://www.sqlfiddle.com/#!2/50ef8/2

SELECT id, Names, TOTALSCORE, Rank
FROM
(  
   SELECT t.*, 
         IF(@p = TOTALSCORE, @n, @n := @n + 1) AS Rank, 
         @p := TOTALSCORE
   FROM(
     SELECT id, Names,SUM(score) TOTALSCORE
         FROM exam, (SELECT @n := 0, @p := 0) n
         GROUP BY id
         ORDER BY TOTALSCORE DESC
   ) t
) r
WHERE NOT EXISTS(
  SELECT null FROM exam e
  WHERE e.id = r.id
    AND e.score/e.Fullmark < 0.33
);



- 编辑 -以上查询计算错误的排名值,这里是改进版本:

SELECT id, Names, TOTALSCORE, Rank
FROM
(  
   SELECT t.*, 
         IF(@p = TOTALSCORE, @n, @n := @n + 1) AS Rank, 
         @p := TOTALSCORE
   FROM(
     SELECT id, Names,SUM(score) TOTALSCORE
         FROM exam e1, (SELECT @n := 0, @p := 0) n
         WHERE NOT EXISTS(
            SELECT null FROM exam e2
            WHERE e1.id = e2.id
            AND e2.score/e2.Fullmark < 0.33
          )
         GROUP BY id
         ORDER BY TOTALSCORE DESC
   ) t
) r
;

和演示: - > http://www.sqlfiddle.com/#!2/50ef8/4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM