mysql - ORDER BY 和 GROUP BY 这些结果在单个查询中

标签 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 子句中获取两个用户,按正确答案的数量对它们进行排序,然后将它们分组在一起,所以我应该得到这两个用户的 2 个最高分数。

实际上,它给了我两个结果,但 Joe 给出的结果给了我两个值中较低的一个 (2),Bob 排在第一位,得分为 3。交换到 ASC 排序可以保持分数相同,但将 Joe 排在第一位.

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

最佳答案

您正在寻找 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

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

关于mysql - ORDER BY 和 GROUP BY 这些结果在单个查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741457/

相关文章:

php - MySQL DELETE 语句不删除行

mysql - SQL BETWEEN 区分大小写

sql - 按列值的差异对 SQL 中的数据进行分组

php - 如何添加对数据进行排序的按钮或链接?

sql - ORDER BY 仅适用于列别名

sql - 在事务中保留自增 ID

mysql - 比较 MySQL 中同一个表的两行

mysql - 在 where 子句中无效使用没有聚合函数的组函数

MySQL 子查询计数与查询计数不同

Mysql:WHERE LIKE条件中按优先级排序