2013-07-25 2 views
1

С этими кодами I echo Rank студент, чей regd равен $regd. Фактически, это рабочий код. Тем не менее, мне посоветовал друг, что в mysql заявление Distinct и Group By не должно использоваться вместе. Но как новичок я не мог понять, как реализовать его, не используя Distinct, потому что он не возвращает строки без Distinct. Может ли кто-нибудь предложить мне, как я улучшу эти коды?Как улучшить этот код php mysql?

<?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']; 
    } 
} 
?>  
+2

Может хотите взглянуть на [codereview.stackexchange.com] (http://codereview.stackexchange.com) –

+1

Я сильно изменяли форматирование запросов, но это было так грязно, что я мог бы сбиты с ног. Пожалуйста, взгляните на него и исправьте его, если необходимо –

+0

@STT LCU спасибо –

ответ

1

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 
+0

Я только что проверил ваш код в скрипте sql, и он отлично работает. Но строки рангов встречаются как '[BLOB - 1B]' в phpmyadmin, что могло бы вызвать это? Что-то не так с моим phpmyadmin? –

+1

Я могу повторить то, что хочу. Ты спасаешь мою жизнь. Спасибо. Но я не знаю, вызовет ли BLOB-01 проблему в будущем, поэтому я не буду задавать другой вопрос. –

0

Начните с этого:

Пожалуйста, не используйте mysql_ * функции для нового кода. Это no longer maintained, сообщество начинается в the deprecation process.

Вместо этого вы должны изучить подготовленные заявления и использовать либо PDO, либо MySQLi. Если вы не можете решить, эта статья will help to choose.

Если вы хотите узнать, here is good PDO tutorial.

+5

Насколько я знаю, я бы не считал это ответом на его вопрос. – CharliePrynn

Смежные вопросы