2012-04-18 2 views
0

Пожалуйста, мне нужна ваша помощь в том, как оптимизировать мой запрос. Я хочу получить 10 разных данных из одной таблицы.Как оптимизировать 10 запросов в одном

Вот один из запросов

 $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"> Пример Изображение

спасибо за ваше время и терпение.

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'? Один к одному? Один ко многим? – 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']; 
} 

Вы можете открыть таблицу HTML перед циклом for. При изменении семестра или уровня вы можете закрыть предыдущую таблицу и открыть новую, добавить заголовок для остальных строк того же семестра/уровня и т. Д. И т. Д. Вы можете закрыть таблицу HTML после цикл for.

Это немного сложно, но в конце концов оно вас доставит.

+0

Спасибо за помощь. Как я могу отделить выборки строк для всех комбинаций в разные таблицы? См. Обновленный вопрос. Thanks –

+0

Пример: разделение результатов на уровень и семестр. Настройте свои потребности. – jpic

-1

Просто получить Alls возможные комбинации через ваш ИНЕКЕ:

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

Если вы действительно хотите, чтобы оптимизировать его затем построить karnaugh map - стол с одной осью перечисляя все возможные значения semester_name и другой доступ с каждым возможное значение уровня, затем отметьте пересечения, которые вы хотите включить в свой запрос. Из этого вы сможете разработать простейший запрос, чтобы сохранить эти данные.

Однако вы, так как вы не указывают на то, что значения, которые вы хотите исключить, и вы включили все возможные комбинации semester_name = {дождь, hamattarn} и уровень = {100.200.300.400.500}, то простое решение будет:

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

Вам необходимо включить semester_name и уровень в ИНЕКЕ, и жизнь будет проще, если вы

ORDER BY semester_name, level, course 
Смежные вопросы