2012-01-12 110 views
2

我正试图学习PHP和MySQL中的多个SQL查询的最佳实践。不知道我是否应该有两个单独的查询,或者如果我应该加入(或联合?)我的查询到一个。多个SELECT查询和循环遍历PHP和mySQL结果

我可以做以下事情还是有另一种方式来完成同样的事情?

请务必注意,我的第一个查询是提取问题和答案的测验列表。第二个查询是拉取我将用于根据测验分数分配给用户的分数配置文件列表。这两个表之间的唯一关系是两者都使用与我的“测验”表中链接到ID的相同外键。我不需要并排连接这些表,但我想我可能需要将它们联合起来,这样我的第二个查询结果才会出现在第一个查询结果之后。

现在,如果我应该将我的查询合并为一个,我不知道如何循环查询结果来创建我的数组。当我遍历每个结果时,我会需要一些条件逻辑来处理我的第一个查询结果,而另一些查询结果则与我的第二个查询结果不同。我会如何写这些条件?

这是我现在正在做的,这似乎是两个单独的查询工作的罚款...

......在数据库中查询第一时间让我的问答题和答案:

$result_quiz = mysql_query(" 
    SELECT quiz_question.question_text, quiz_question.id, quiz_answer.answer_text, quiz_answer.points 
    FROM quiz 
    JOIN quiz_question ON (quiz.id = quiz_question.quiz_id) 
    JOIN quiz_answer ON (quiz_question.id = quiz_answer.quiz_question_id) 
    WHERE quiz.id = $id; 
"); 

......然后根据上面的查询,建立我的问题和答案数组:

$quiz = array(); 
while ($row = mysql_fetch_assoc($result_quiz)) { 
    if (!isset($quiz['questions']['q'.$row['id'].''])) { 
     $quiz['questions']['q'.$row['id'].''] = array(
      'question' => $row['question_text'], 
      'answers' => array() 
     ); 
    } 
    $quiz['questions']['q'.$row['id'].'']['answers'][] = array('answer' => $row['answer_text'],'points' => $row['points']); 
} 

......然后查询数据库的第二次拿到得分配置文件的列表:

$result_profile = mysql_query(" 
    SELECT quiz_profile.name, quiz_profile.description, quiz_profile.min_points, quiz_profile.max_points 
    FROM quiz 
    JOIN quiz_profile ON (quiz.id = quiz_profile.quiz_id) 
    WHERE quiz.id = $id; 
"); 

......然后通过我的第二个查询循环,所以我可以追加分数型材我数组:

while ($row = mysql_fetch_assoc($result_profile)) { 
    $quiz['profiles'][] = array('name' => $row['name'],'description' => $row['description'],'min_points' => $row['min_points'],'max_points' => $row['max_points']); 
} 

这是最好的方法?

或者我应该将我的查询合并为一个使用UNION?

如果是这样,我该如何写我的条件来知道我循环的结果?

非常感谢!

回答

1

我建议坚持使用目前的方法,除非性能存在严重问题 - 将两个查询结合起来可能会提高总吞吐量(稍微),但会显着增加显示它所需的代码的复杂性。

1

我建议退一步看看你的应用程序的设计,而不是代码本身:如果你走下UNION之路,你必须牺牲你的问题代码和你的scoreprofiles代码之间的所有隔离。

我说,这不是一件好事:如果有一天比分配置文件以某种方式在数据库和用户之间重新计算或变形?是否直观,为此你必须触摸从db获取问题的功能?

在PHP中,有一条经验法则(根据所有经验法则)并非100%完美,而是一个开始:应该有可能将与一个功能字段有关的所有代码定位在一个文件,include s和require镜像依赖关系。