我正在尝试在PHP和mySQL中学习多个SQL查询的最佳实践。不确定我是否应该有两个单独的查询,或者我是否应该将(或UNION?)我的查询加入一个查询。
我可以执行以下操作,还是有其他方法可以完成相同的操作?
重要的是要注意我的第一个查询是提取测验的问题和答案列表。第二个查询是拉出我将用于根据他们的测验分数分配给用户的分数配置文件列表。这两个表之间的唯一关系是两个都使用链接到我的“测验”表中的ID的相同外键。我不需要并排加入这些表,但我想我可能需要UNION它们,所以我的第二个查询结果出现在第一个之后。
现在,如果我将我的查询合并为一个,我不知道如何循环查询结果来创建我的数组。当我循环遍历每个结果时,我需要一些条件逻辑,它对我的第一个查询结果执行某些操作,并且与我的第二个查询结果不同。我该怎么写这些条件?
以下是我现在正在做的事情似乎可以作为两个单独的查询正常工作......
...第一次查询数据库以获取我的测验问题和答案:
$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将我的查询合并为一个?
如果是这样,我如何编写条件以了解我正在循环的结果?
非常感谢!
答案 0 :(得分:1)
我建议坚持使用当前的方法,除非性能存在严重问题 - 将两个查询结合起来可能会略微提高总吞吐量,但会显着增加显示它所需的代码的复杂性。
答案 1 :(得分:1)
我建议您退一步设计您的应用程序,而不是代码本身:如果您沿着UNION路走下去,您必须牺牲您的问题代码和您的scoreprofiles代码之间的所有隔离。
我说,这不是一件好事:如果有一天得分配置文件以某种方式重新计算或在数据库和用户之间进行转换怎么办?它是否直观,为此您必须触摸从db获取问题的函数?
在PHP中,有一条经验法则,(根据所有经验法则)并非100%完美,但却是一个很好的开始:应该可以将与一个功能领域相关的所有代码都放在一个文件,include
和require
镜像依赖项。