ORDER BY 和 GROUP BY 那些结果在一个查询中

ORDER BY and GROUP BY those results in a single query

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

我的数据如下所示:

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 排序可以保持得分不变,但位置乔先。

那么,我怎样才能达到我所需要的呢?

MySql 在按子句分组方面相当宽松 - 但根据经验,您应该尝试遵循其他 DBMS 强制执行的规则: 在 group-by-query 中,每一列应该是 group-by-clause 的一部分或包含一个列函数。

对于您的查询,我建议:

SELECT `TP_ID`,`name`,max(`correct`)    FROM `entries` 
WHERE       `TP_ID` IN('10153627558393996', '10154312970149546') 
GROUP BY    `TP_ID`,`name` 

因为你的 table 看起来很不规范,所以 group by name-par 可以省略,但在其他情况下可能是必要的。

ORDER BY 仅用于指定返回结果的顺序,但对返回的结果没有任何作用 - 因此您需要应用 max()-function 来获得最大数量的结果正确答案。

您在 groupwise maximum 之后,可以通过将分组结果连接回 table 获得:

SELECT * FROM entries NATURAL JOIN (
    SELECT   TP_ID, MAX(correct) correct
    FROM     entries
    WHERE    TP_ID IN ('10153627558393996', '10154312970149546')
    GROUP BY TP_ID
) t

当然,如果一个用户有多个最高分的记录,它会return全部;如果您只想要一些子集,则需要表达确定哪个子集的逻辑。