我有一个包含id
,type
,question
,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
用于分页,第二个查询未显示限制7用于A,B类型liimit 6用于C类型。
如何为此编写查询?
答案 0 :(得分: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总是在选择可能是巨型表上的性能杀手的记录之前对完整表进行排序。如果这是一个问题,那就是other solutions。
希望这有帮助!