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全部;如果您只想要一些子集,则需要表达确定哪个子集的逻辑。
我正在尝试从单个 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全部;如果您只想要一些子集,则需要表达确定哪个子集的逻辑。