我正在尝试从单个表中查询数据集,其中包含来自多个用户的测验答案/条目。我想从每个用户中提取最高得分条目。
我的数据如下所示:
ID TP_ID quiz_id name num_questions correct incorrect percent created_at
1 10154312970149546 1 Joe 3 2 1 67 2015-09-20 22:47:10
2 10154312970149546 1 Joe 3 3 0 100 2015-09-21 20:15:20
3 125564674465289 1 Test User 3 1 2 33 2015-09-23 08:07:18
4 10153627558393996 1 Bob 3 3 0 100 2015-09-23 11:27:02
我的查询如下所示:
SELECT * FROM `entries`
WHERE `TP_ID` IN('10153627558393996', '10154312970149546')
GROUP BY `TP_ID`
ORDER BY `correct` DESC
在我看来,应该做的是从IN
子句中获取两个用户,按correct
个答案的数量对它们进行排序然后将它们组合在一起,所以我应该留下这两个用户获得2个最高分。
实际上它给了我两个结果,但是来自Joe的一个给了我两个值中的较低者(2),Bob首先得分为3.交换到ASC排序使得得分保持不变但乔先生。
那么,我怎么能实现我的需要呢?
答案 0 :(得分:2)
您在groupwise maximum之后,可以通过将分组结果加入表格来获取:
SELECT * FROM entries NATURAL JOIN (
SELECT TP_ID, MAX(correct) correct
FROM entries
WHERE TP_ID IN ('10153627558393996', '10154312970149546')
GROUP BY TP_ID
) t
当然,如果一个用户有多个最高分的记录,它将返回所有记录;如果你只想要一些子集,你需要表达用于确定哪个子集的逻辑。
答案 1 :(得分:0)
MySql在逐个子句时非常宽松 - 但根据经验,您应该尝试遵循其他DBMS强制执行的规则: 在逐个查询中,每列应该是逐个子句的一部分或包含列函数。
对于您的查询,我建议:
group by name
由于你的表似乎非常规范化,ORDER BY
- par可以省略,但在其他情况下可能是必要的。
max()
仅用于指定返回结果的顺序,但不会对返回的结果执行任何操作 - 因此您需要应用$quiz_results = array( 'q1' => 'yes',
'q2' => 'yes',
'q3' => 'no',
);
$answers = array( 1 => 'yes',
2 => 'no',
3 => 'yes'
);
$totalquestions = count($answers);
$correct = 0;
foreach($answers as $key => $answer){
//q + the key should do it. Its easier if they are the same obviously
if($answer == $quiz_results['q'.$key]){
// correct
$correct++;
}
}
echo 100 / $totalquestions * $correct; //returns 33.333333%
- 函数来获得最多的正确答案