douxi3977 2013-07-19 09:29
浏览 50
已采纳

任何人都可以帮助我在PHP和MySQL的这个排名?

I have mysql table like below:

CREATE TABLE IF NOT EXISTS `cxexam` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`regd` int(11) NOT NULL,
`Name_of_Student` varchar(100) COLLATE latin1_general_ci NOT NULL,
`Class` varchar(50) COLLATE latin1_general_ci NOT NULL,
`Roll_no` int(11) NOT NULL,
`Section` varchar(50) COLLATE latin1_general_ci NOT NULL,
`Name_of_exam` varchar(100) COLLATE latin1_general_ci NOT NULL,
`Test_date` date NOT NULL,
`Subject` varchar(50) COLLATE latin1_general_ci NOT NULL,
`Full_mark` int(11) NOT NULL,
`Mark_score` int(11) NOT NULL,
`Year` year(4) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=7 ;

--

-- Dumping data for table cxexam

INSERT INTO `cxexam` (`id`, `regd`, `Name_of_Student`, `Class`, `Roll_no`, `Section`, `Name_of_exam`, `Test_date`, `Subject`, `Full_mark`, `Mark_score`, `Year`) VALUES

(6, 20, 'Ramdina', 'X', 9, 'A', 'Second Term Unit Test', '2013-07-19', 'English', 20, 18, 2013),
(3, 2, 'Zonundanga', 'X', 5, 'A', 'Second Term Unit Test', '2013-07-19', 'English',   20, 12, 2013),
(4, 40, 'Lalnunkimi', 'X', 10, 'A', 'Second Term Unit Test', '2013-07-19', 'English', 20, 18, 2013);

the mysql query will produce:

regd   totalscore    rank
20   18   1
2   18   1
40  12   2

And I want to output rank of whose regd='2' using php. I am using the following php code and mysql code but I need to refresh my page to get the code working. The query is working fine in phpmyadmin, but most of the times I got only 1 as rank even when I change the regd.

mysql_select_db($database_dbconnect, $dbconnect);
$query_myrank = "SELECT Distinct regd, Test_date, Year, Name_of_Student, TOTALSCORE,  Rank FROM 
(SELECT *, IF(@marks = (@marks := TOTALSCORE), @auto, @auto := @auto + 1) AS
Rank FROM (SELECT Name_of_Student, regd, Test_date, Year, SUM(Mark_score) AS TOTALSCORE 
FROM cxexam, (SELECT @auto := 0, @marks := 0) AS init GROUP BY regd, Year ORDER BY TOTALSCORE DESC) t) AS result HAVING regd='2' and Year='2013' and Test_date between '2013-07-01' and '2013-07-30'";
$myrank = mysql_query($query_myrank, $dbconnect) or die(mysql_error());
$row_myrank = mysql_fetch_assoc($myrank);
$Rank= $row_myrank['Rank'];

I echo it using <?php echo $row_myrank['Rank'];?> I would be very happy if anyone can get me an alternative solution using php because I am trying to apply this ranking in my school marksheet management system.

This is my new code:

<?php 
mysql_select_db($database_dbconnect, $dbconnect);
$query_myrank = "SELECT Distinct regd, Test_date, Year, Name_of_Student, TOTALSCORE, Rank 
FROM (SELECT *, IF(@marks = (@marks := TOTALSCORE), @auto, @auto := @auto + 1) AS Rank 
FROM (SELECT Name_of_Student, regd, Test_date, Year, SUM(Mark_score) AS TOTALSCORE 
FROM cxexam, (SELECT @auto := 0, @marks := 0) AS init GROUP BY regd, Year ORDER BY TOTALSCORE DESC) t) AS result HAVING Year='$yr' and Test_date between '$fdate' and '$tdate'";
$myrank = mysql_query($query_myrank, $dbconnect) or die(mysql_error());

$i = 0;
$j = 1;
$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['regd'] == $regd)
{
echo $value['Rank'];
}
}
?>
  • 写回答

1条回答 默认 最新

  • dongxie9448 2013-07-19 09:39
    关注

    When you do the loop add an automatic increment like this.

        $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]['Mark_Score'] == $data[$i]['Mark_Score'])
          {
           $data[$i]['rank'] = $j;
          }else{
           $data[$i]['rank'] = ++$j;
          }
          $i++;
        }
    

    It would be a bad answer if don't say "Don't use mysql_* function but PDO". Look at this link please. http://www.php.net/manual/fr/class.pdo.php

    EDIT: How to output data

    foreach($data as $key => $value)
    {
     if($value['regd'] == 2)
     {
       echo $value['field'];
     }
    }
    

    Just change field by the ones in your query.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看