0

我有一个带有idtypequestion和字段option1 .. 4的问题表。answer有 A、B 和 C 三种类型的问题。

我必须为 A 型和 B 型分别选 7 个随机问题,为 C 型选 6 个随机问题。每个测试总共显示 20 个问题。

我必须一次只显示一个问题,然后在下一个按钮上显示下一个问题。所以我为此使用分页。所以我必须在mysql查询的最后添加$limit, $start。我怎样才能为此编写一个查询。

我写了两个查询,例如:

1:
(select * from dgm_questions Where ques_type IN('A') Order by rand() ASC Limit 7) union (select * from dgm_questions Where ques_type
IN('B') Order by rand() ASC Limit 7) union (select * from
dgm_questions Where ques_type IN('C') Order by rand() ASC
Limit 6)

2: select ques_id, ques_type from dgm_questions Where ques_type IN('A','B','C') Order by rand() ASC Limit 20

第一个查询给了我总共 20 个问题,但无法添加分页$limit$start第二个查询不显示 A 类型的限制 7,C 类型的 B 类型限制 6。

我该如何为此编写查询?

4

1 回答 1

0

我会选择会话解决方案(如果这是一个选项),因为您不想为每个请求选择 20 个随机问题(当您单击下一个按钮时),我猜,如果您使用分页,就会发生这种情况。

所以我的建议是根据您的标准获取 20 个随机问题并将它们(实际上只是 ID)存储在一个会话中,并从那里为每个问题页面加载:

// on the questionaire start
// depending on wich library you use fetch the random question ids
// with your sql statement
SELECT ques_id FROM dgm_questions WHERE ques_type IN('A') ORDER BY rand() ASC Limit 7
UNION
SELECT ques_id FROM dgm_questions WHERE ques_type IN('B') ORDER BY rand() ASC Limit 7
UNION
SELECT ques_id FROM dgm_questions WHERE ques_type IN('C') ORDER BY rand() ASC Limit 6

// assuming the result is stored in $question_ids
// you can shuffle those questions, so they're not in type order anymore
shuffle($question_ids)

// save question ids in session
$_SESSION['question_ids'] = $question_ids;
$_SESSION['current_question_index'] = 0;

// on each request
"SELECT * FROM dgm_questions WHERE ques_id = " . $_SESSION['question_ids'][$_SESSION['current_question_index']];
$_SESSION['current_question_index']++;

现在,这只是为了让您总体了解如何解决问题。请记住,如果您按 random() 排序,MySQL 总是在选择记录之前对整个表进行排序,这可能会成为大型表的性能杀手。如果这是一个问题,还有其他解决方案

希望这可以帮助!

于 2013-09-28T22:50:32.847 回答