我有下表。
Question Marks
----------------
Qns 1 1
Qns 2 2
Qns 3 2
Qns 4 1
Qns 5 1
Qns 6 1
现在我需要随机选择一个问题,SUM(marks) = 4
预期结果可以
1, 4, 5, 6
OR
2, 3
OR
1, 2, 4
等等。
我需要有关编写SQL查询的帮助。
答案 0 :(得分:0)
我将承认我不知道如何通过查询执行此操作。但是,如果您执行查询以选择要采样的所有问题,那么这里是一个PHP解决方案:
这将从问题样本池中随机抽取一组期望的问题。
然后它将对随机选择的问题集的值求和,以查看它是否合计为所需的“标记”总数。
这将在while循环内完成。如果总和不等于期望的“总分”,那么它将从问题池中选择一组新的随机问题,然后重试。它将执行此操作,直到满足条件为止。
因此,这里的风险是您输入了无法满足或非常大的参数。如果发生这种情况,脚本将一直运行直到超时。
如果您的样本集很小,那么大多数时候应该可以相当可靠地工作,但是如果样本集很大或没有可以加总到“标记”总数的问题集,那么这将不起作用。
尝试一下:
$questions = array(
'1' => 1,
'2' => 2,
'3' => 2,
'4' => 1,
'5' => 1,
'6' => 1
);
function getQuestions($questions, $numberQuestions, $markTotal){
do{
$sample = array_rand($questions, $numberQuestions);
$sum = 0;
foreach($sample as $key=>$value){
$sum += $questions[$value];
}
}while($sum != $markTotal);
return $sample;
}
$numberQuestions = 3;
$markTotal = 4;
$results = getQuestions($questions, $numberQuestions, $markTotal);
echo '<pre>';
print_r($results);
echo '</pre>';
//Outputs
Array
(
[0] => 1
[1] => 3
[2] => 4
)
这将输出一个数组,其中包含与从问题库中选择的问题对应的键值。
所以我做了一些基本的基准测试,以下是一些简单的观察方法可以帮助您:
如果您想通过很多问题进行测验,则需要更长的时间才能找到一组总和达到您希望的分数的问题。考试问题越少,找到一组总计为您的总分数的值就越容易。
您的标记值范围也会有很大的不同。每个问题的分数值越小,意味着更容易找到一系列分数值加起来得出特定的总分数。
如果您的总分数相对于您想要的问题数量太高,您可能永远都不会达到总分数。
相对于每个问题的分数范围以及您需要测试多少个问题,样本问题库中存在大量问题似乎对时间的影响很小。
有一个包含100个问题的示例问题库,所有这些问题的得分都在0到20之间,并要求10个问题,满分为50分,效果很好。但是,在相同情况下将问题数量增加到20个非常昂贵。
我发现每个问题的分数范围与每个测试中期望的问题数量之间的关系似乎很好。
如果您遵循此规则,我希望您能够以最小的成本可靠地运行此功能。
问题池大小= 100
得分范围= 0-20
所需测试题数= 20
(平均最高分数范围(不计算异常值) X 所需的测试问题数)/ 2 = 您应使用的总分。
(20 x 20)/ 2 = 200 <-好的得分值。
这当然是一个指导原则,我相信您可以尝试并获得一些喜欢的结果。我首先尝试将分母从2 ect增加到3 ect ...直到失败。通过增加分母的大小,您说的是我希望每个问题通常由较低的价值分数组成。分母越大,平均分母就越慢;如果降低,分母也变慢。
示例:
(20 x 20)/1.5 = 266 <-这将寻找更高价值的问题分数。还是蛮快的。值<1.5确实开始使其变慢。
(20 x 20)/ 2 = 200 <-这通常会在整个值范围内出现问题。 -非常快!
(20 x 20)/ 3 = 133 <-仍然是可靠的分数得分值。通常,这会发现更多的低价值问题。 -仍然相当快。
(20 x 20)/ 4 = 100 <-这将主要查找较低价值的问题。 -随着分母从此处变大,它将变得更加昂贵和缓慢。
问题库的大小确实起着一定的作用。如果开始运行缓慢,请将更多问题添加到您的问题库中,看看是否有帮助。
因此,如果您希望分数得分为50,则可以看到您在测试中可以限制多少个问题与问题的分数范围有关。
只是想一想。
希望有帮助!