0

クエリを最適化する方法についてサポートが必要です。同じテーブルから10個の異なる行のデータをフェッチしたいと思います。

これがクエリの1つです

     $query1 = mysql_query("SELECT m.Course_code AS 'Course', m.score, m.grade
                   FROM maintable AS m  
                   INNER JOIN students AS s ON
                   m.matric_no = s.matric_no
                   INNER JOIN Courses AS c ON
                   m.Course_code = c.Course_code
                   WHERE m.matric_no = '".$matric_no."'
                   AND m.semester_name = 'hamattarn'
                   AND m.level = '100' ") or die (mysql_error());

                  $number_cols1 = mysql_num_fields($query1) ;

クエリのこの部分は、すべてのクエリで変更されます

  AND m.semester_name = 'hamattarn'
                   AND m.level = '100' "

 AND m.semester_name = 'rain'
                   AND m.level = '100' "

 AND m.semester_name = 'hamattarn'
                   AND m.level = '200' "

 AND m.semester_name = 'rain'
                   AND m.level = '200' "

  AND m.semester_name = 'hamattarn'
                   AND m.level = '300' "

  AND m.semester_name = 'rain'
                   AND m.level = '300' "

  AND m.semester_name = 'hamattarn'
                   AND m.level = '400' "

  AND m.semester_name = 'rain'
                   AND m.level = '400' "

 AND m.semester_name = 'hamattarn'
                   AND m.level = '500' "

 AND m.semester_name = 'rain'
                   AND m.level = '500' "

これが私がクエリで達成できたことの写真です。最適化した後も、このように表示したいと思います。

<href="http://i.imgur.com/IGEj2.png">サンプル画像

時間と忍耐に感謝します。

更新-これは、最適化の前に10個のクエリのそれぞれからの行テーブルを表示する方法です。新しい最適化されたクエリでこのテーブルタイプの結果をどのように達成できますか?

   echo "<table class=\"altrowstable\" id = " bgcolor = gold >\n";
     echo "<tr align=center>\n";
     for ($i=0; $i<$number_cols10; $i++)
     {
               echo "<th>" . mysql_field_name($query10, $i). "</th>";
     }
     echo "</tr>\n";
               while ($row = mysql_fetch_row($query10))
    {
    echo "<tr align=center>\n";
    for ($i=0; $i<$number_cols10; $i++)
    {
    echo "<td>";
    if (!isset($row[$i]))
    {echo "NULL";}
    else
    {
    echo "<b>".$row[$i]."</b>";
    }
    echo "</td>\n";
    }
    echo "</tr>\n";
    }
    echo "</table>"; 
    echo"</span>" ;

ありがとう

4

3 に答える 3

3

なぜこのようなものではないのですか?

WHERE m.semester_name IN ('rain', 'hamattarn') 
  AND m.level IN ('100', '200', '300', '400', '500'))

結果はまちまちになるため、次のように、期待どおりの順序で結果を取得する必要があります。

ORDER BY m.semester_name, m.level

これにより、結果をPHPで分割できるようになります。これは、次のような一般的な方法です。

$previous_semester = $previous_level = false;
foreach(mysql_fetch_array($query) as $row) {
    if ($previous_semester == $row['semester_name']) {
        // row semester is different from the previous one
        echo $row['semester_name'];
    }

    if ($previous_level == $row['level']) {
        // row level is different from previous one
        echo $row['level']; 
    }

    print_r($row);

    $previous_level = $row['level'];
    $previous_semester = $row['semester_name'];
}

forループの前にHTMLテーブルを開くことができます。学期またはレベルが変更された場合は、前のテーブルを閉じて新しいテーブルを開いたり、同じ学期/レベルの残りの行のタイトルを追加したりできます。ループ。

少し注意が必要ですが、最終的にはそこに到達します。

于 2012-04-18T09:48:03.140 に答える
0

本当に最適化したい場合は、カルノー図を作成します。1つの軸がsemester_nameのすべての可能な値を列挙し、もう1つの軸がlevelのすべての可能な値を列挙するテーブルを作成し、クエリに含める交差点をマークします。これから、そのデータを提供するための最も単純なクエリを実行できるようになります。

ただし、除外する値を指定せず、semester_name = {rain、hamattarn}とlevel = {100,200,300,400,500}の可能なすべての組み合わせを含めたので、簡単な解決策は次のようになります。

WHERE semester_name IN ('rain', 'hamattarn')
AND level in (100,200,300,400,500)

where句にsemester_nameとlevelを含める必要があります。そうすれば、人生はよりシンプルになります。

ORDER BY semester_name, level, course
于 2012-04-18T12:12:31.413 に答える
-1

WHERE句を介して可能なすべての組み合わせを取得するだけです。

WHERE m.matric_no = :matric_no
AND (
       m.semester_name = 'hamattarn'
    OR m.semester_name = 'rain'
)
AND (
       m.level = '100'
    OR m.level = '200'
    OR m.level = '300'
    OR m.level = '400'
)
于 2012-04-18T09:50:24.153 に答える