С помощью этих кодов я повторяю Rank
студентки, чей regd
равен $regd
. Фактически, это рабочий код. Тем не менее, мне посоветовал друг, что в mysql выражение Distinct
и Group By
не должны использоваться вместе. Но, будучи новичком, я не мог понять, как реализовать его, не используя Distinct
потому что он не возвращает строки без Distinct
. Может ли кто-нибудь предложить мне, как я улучшу эти коды?
<?php mysql_select_db($database_dbconnect, $dbconnect); $query_myrank = "SELECT Distinct regd, Name_of_exam, Name_of_Student, TOTALSCORE, Rank FROM (SELECT *, IF(@marks = (@marks := TOTALSCORE), @auto, @auto := @auto + 1) AS Rank FROM (SELECT Name_of_Student, regd, Name_of_exam, SUM(Mark_score) AS TOTALSCORE FROM cixexam, (SELECT @auto := 0, @marks := 0) AS init GROUP BY regd ORDER BY TOTALSCORE DESC) t) AS result HAVING (Name_of_exam='First Terminal Exam' OR Name_of_exam='First Term Test')"; $myrank = mysql_query($query_myrank, $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['regd'] == $regd) { echo $value['Rank']; } } ?>
Distinct
медленнее, чем Group By
. Вы можете пойти так, не используя Group By
и Distinct
вместе, и это может быть то, чего вы хотите достичь.
SELECT regd, Roll_no, Name_of_Student, Name_of_exam, TOTALSCORE, Rank FROM ( SELECT t.*, IF(@p = TOTALSCORE, @n, @n := @n + 1) AS Rank, @p := TOTALSCORE FROM ( SELECT regd, Roll_no, Name_of_Student, Name_of_exam, SUM(Mark_score) TOTALSCORE FROM cixexam, (SELECT @n := 0, @p := 0) n WHERE (Name_of_exam='First Terminal Exam' OR Name_of_exam='First Term Test') GROUP BY regd ORDER BY TOTALSCORE DESC ) t ) r
Начните с этого:
Пожалуйста, не используйте функции mysql_ * для нового кода. Они больше не поддерживаются, и сообщество начинает процесс устаревания .
Вместо этого вы должны узнать о подготовленных операторах и использовать либо PDO, либо MySQLi . Если вы не можете решить, эта статья поможет выбрать .
Если вы хотите узнать, вот хороший учебник PDO .