我正在尝试学习在 PHP 和 mySQL 中使用多个 SQL 查询的最佳实践。不确定我是否应该有两个单独的查询,或者我是否应该将我的查询合并(或 UNION?)。
我可以执行以下操作还是有其他方法可以完成同样的事情?
请务必注意,我的第一个查询是提取测验的问题和答案列表。第二个查询是提取一个分数配置文件列表,我将使用它根据用户的测验分数分配给他们。这两个表之间的唯一关系是它们都使用相同的外键链接到我的“测验”表中的 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 将我的查询合并为一个?
如果是这样,我如何编写我的条件以了解我循环的结果是什么?
非常感谢!
最佳答案
我建议坚持当前的方法,除非存在严重的性能问题 - 结合这两个查询可能会(略微)提高总吞吐量,但会显着增加显示它所需的代码的复杂性。
关于php - PHP 和 mySQL 中的多个 SELECT 查询和循环结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8838899/