我在Ubuntu 8.04 LAMP上使用MySQLi和PHP(5.2.4)MySQL(5.0.51a)。
相关的Db表如下:
Questions
+----+------------------------------------------------------------------------------------------------------------+
| id | question |
+----+------------------------------------------------------------------------------------------------------------+
| 1 | What is the correct rate of flow (in millilitres per minute) for a 14<abbr title="Gauge">G</abbr> cannula? |
| 2 | Which of the following drugs is not an anaesthetic induction agent? |
+----+------------------------------------------------------------------------------------------------------------+
answers
+----+--------------------------------------------------------+
| id | answer |
+----+--------------------------------------------------------+
| 1 | 344<abbr title="millilitres per minute">ml/min</abbr>. |
| 2 | 205<abbr title="millilitres per minute">ml/min</abbr>. |
| 3 | 98<abbr title="millilitres per minute">ml/min</abbr>. |
| 4 | 60<abbr title="millilitres per minute">ml/min</abbr>. |
| 5 | Thiopental sodium |
| 6 | Propofol |
| 7 | Etomidate |
| 8 | Domperidone |
+----+--------------------------------------------------------+
a_lookup (to associate questions with answers)
+------+------+
| q_id | a_id |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 2 | 5 |
| 2 | 6 |
| 2 | 7 |
| 2 | 8 |
+------+------+
我正在使用MySQLi连接到Db,使用以下内容(请记住我刚刚编辑了真正的用户名,密码和数据库名称,而不是占位符泛型):
<?php
if (!isset($qtype) && !isset($submitted)) {
/*
=========================================================================
= queries the database if no specific question-type selected =
=========================================================================
*/
$mysqli = new mysqli("localhost", "username", "password", "db_name");
if ($result = $mysqli->query(
"SELECT questions.id as qid,
questions.question as question
FROM
questions;")) {
while ($row = $result->fetch_object()) {
$i = $row->qid;
$q[$i][question] = $row->question;
if ($answers = $mysqli->query(
"SELECT answers.id, answers.answer FROM answers, a_lookup, questions WHERE answers.id=a_lookup.a_id AND '$i'=a_lookup.q_id;")) {
while ($row = $answers->fetch_object()) {
if (!isset($c)) {
$c = 1;
}
else {
$c = $c;
}
$q[$i][answers][$c] = $row->answer;
$c++;
}
}
}
}
$mysqli->close();
}
elseif (isset($qtype)) {
// this part should hopefully be invoked when tags 'question-types' are supported
}
?>
这会按预期返回问题,print_r位于以下位置:
Array
(
[1] => Array
(
[question] => What is the correct rate of flow (in millilitres per minute) for a 14G cannula?
[answers] => Array
(
[1] => 344ml/min.
[2] => 205ml/min.
[3] => 98ml/min.
[4] => 60ml/min.
[5] => 344ml/min.
[6] => 205ml/min.
[7] => 98ml/min.
[8] => 60ml/min.
)
)
[2] => Array
(
[question] => Which of the following drugs is not an anaesthetic induction agent?
[answers] => Array
(
[9] => Thiopental sodium
[10] => Propofol
[11] => Etomidate
[12] => Domperidone
[13] => Thiopental sodium
[14] => Propofol
[15] => Etomidate
[16] => Domperidone
)
)
我只是因为我的八个结果,而不是我期待的四个结果而感到困惑。我得到了八个 - 任何对数据库有所了解的人都会期望我是使用mysql终端客户端还是php的mysql-api。
创建重复项我做错了什么?
答案 0 :(得分:1)
你不应该在这样的循环中运行查询,因为它效率很低 - 你应该能够在一个查询中获取数据,例如:
SELECT Questions.id asquestion_id, Questions.question, answers.id as answer_id, answers.answer
FROM Questions
INNER JOIN a_lookup ON (Questions.id = a_lookup.q_id)
INNER JOIN answers ON (a_lookup.a_id = answers.id)
应该直截了当地将结果排序到相同的结构中,它应该更快,例如。
$result = array();
while ($row = $result->fetch_assoc()) {
$questionId = $row['question_id'];
if (!isset($result[$questionId])) {
$result[$questionId] = array('question'=>$result['question'], 'answers' => array());
}
$result[$questionId]['answers'][] = $row['answer'];
}
答案 1 :(得分:1)
您得到重复的答案,因为您的第二个SQL查询与问题表中的问题ID匹配:
尝试
SELECT answers.id, answers.answer FROM answers, a_lookup, questions WHERE
answers.id=a_lookup.a_id AND '$i'=a_lookup.q_id AND '$i' = questions.id;
代替
无论如何。 FROM中的多个表不容易理解。尝试加入,因为你不会忘记表中的过滤器,因为你必须在每个连接中给出一个。