请帮助我如何优化我的查询。我想从同一个表中获取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="Sample">http://i.imgur.com/IGEj2.png">Sample图片
谢谢你的时间和耐心。
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>" ;
谢谢
发布于 2012-04-18 09:48:03
为什么不像这样:
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表。
这有点棘手,但它最终会把你带到那里。
发布于 2012-04-18 12:12:31
如果您真的想优化它,那么构建一个卡诺图 --一个表,其中一个轴枚举semester_name的每个可能值,另一个访问值为每个可能的级别值,然后标记您想要包含在查询中的交叉点。由此,您应该能够计算出最简单的查询来支持这些数据。
但是,由于您没有指示要排除哪些值,并且包含了semester_name={ then、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-18 09:50:24
只需通过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'
)
https://stackoverflow.com/questions/10206802
复制相似问题