2012-04-18 25 views
0

私のクエリを最適化する方法については、あなたの助けが必要です。私は同じテーブルから10の異なる行のデータをフェッチしたいここで1つに10個のクエリを最適化する方法

は、ここで私ができることにした内容の絵だクエリのこの部分は

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' " 

すべてのクエリのために変化している

 $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) ; 

クエリの一つでありますクエリで達成する。最適化した後、私はまだこのように見えます。あなたの時間と忍耐のため

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

感謝。

UPDATE - ここでは、最適化前の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>" ; 

おかげ

+1

(句)OR(句)OR(句)... –

+0

との関係はどうであれば人生は単純になります'維持可能'と 'コース'、 '維持可能'と '学生s'? 1対1? 1対多数? – BenLanc

答えて

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テーブルを開くことができます。 学期やレベルが変わると、前のテーブルを閉じて新しいテーブルを開き、同じ学期/レベルの残りの行のタイトルなどを追加できます。 後でHTMLテーブルを閉じることができますforループ。

少し厄介ですが、最終的にはあなたをそこに連れて行きます。

+0

助けてくれてありがとう。どのようにして、すべての組み合わせの行を異なるテーブルにフェッチすることができますか?更新された質問をご覧ください。 ありがとう –

+0

例が追加されました:レベルと学期ごとの結果の分離。あなたのニーズに合わせてカスタマイズしてください。 – jpic

-1

ちょうどあなたのWHERE句を介したオールズ可能な組み合わせを取得:あなたは本当にkarnaugh map構築し、それを最適化したい場合は

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

助けてくれてありがとう。どのようにして、すべての組み合わせの行を異なるテーブルにフェッチすることができますか?更新された質問をご覧ください。 ありがとう –

0

を - semester_nameのすべての可能な値、すべてを持つ他のアクセスを列挙つの軸を持つテーブルをレベルの可能な値を入力し、クエリに含める交点をマークします。これから、あなたはそのデータをすばやくするための最も簡単なクエリを実行することができます。

あなたは、あなたが除外したい値を示すものではありませんので、あなたはsemester_nameのすべての組み合わせが含まれているただし= {雨、hamattarn}とレベル= {100,200,300,400,500}その後、簡単な解決策は次のようになります。

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

あなたは、where句でsemester_nameとレベルを含める必要があります、そしてあなた

ORDER BY semester_name, level, course 
関連する問題