【问题标题】:How to optimize 10 queries into one如何将 10 个查询优化为一个
【发布时间】:2012-04-18 09:42:40
【问题描述】:

请您帮助我优化我的查询。我想从同一个表中获取 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' "

这是我通过查询能够实现的目标的图片。优化后我仍然希望它看起来像这样。

示例图片

感谢您的时间和耐心。

更新 -- 这是我在优化之前显示 10 个查询中每一个查询的行表的方式。请问如何使用新的优化查询来实现这种表类型? p>

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

谢谢

【问题讨论】:

  • (子句)或(子句)或(子句)...
  • MaintainableCoursesMaintainableStudents是什么关系?一对一?一对多?

标签: php mysql


【解决方案1】:

为什么不这样:

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 表格。 当学期或级别发生变化时,您可以关闭以前的表格并打开一个新表,为同一学期/级别的其余行添加标题,等等...... 你可以在 for 循环之后关闭一个 HTML 表格。

这有点棘手,但最终它会让你到达那里。

【讨论】:

  • 感谢您的帮助。如何将所有组合的行提取分离到不同的表中?请参阅更新的问题。谢谢
  • 添加示例:将每个级别和每个学期的结果分开。根据您的需求进行定制。
【解决方案2】:

如果你真的想优化它,那么构建一个karnaugh map - 一个表,其中一个轴枚举学期名称的每个可能值,另一个访问每个可能的级别值,然后标记要包含在查询中的交叉点.由此,您应该能够制定出最简单的查询来提供该数据。

但是,由于您没有指明要排除哪些值,并且您已经包含了 term_name={rain, hamattarn} 和 level={100,200,300,400,500} 的所有可能组合,因此一个简单的解决方案是:

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

你需要在 where 子句中包含 term_name 和 level,如果你这样做,生活会更简单

ORDER BY semester_name, level, course

【讨论】:

    【解决方案3】:

    只需通过 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'
    )
    

    【讨论】:

    • 感谢您的帮助。如何将所有组合的行提取分离到不同的表中?请参阅更新的问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2018-06-15
    • 2012-12-22
    相关资源
    最近更新 更多