ORDER BY和GROUP BY导致单个查询

时间:2015-09-23 13:49:11

标签: mysql group-by sql-order-by

我正在尝试从单个表中查询数据集,其中包含来自多个用户的测验答案/条目。我想从每个用户中提取最高得分条目。

我的数据如下所示:

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排序使得得分保持不变但乔先生。

那么,我怎么能实现我的需要呢?

2 个答案:

答案 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% - 函数来获得最多的正确答案