【问题标题】:ORDER BY and GROUP BY those results in a single queryORDER BY 和 GROUP BY 这些结果在单个查询中
【发布时间】:2015-09-23 13:49:11
【问题描述】:

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

我的数据如下所示:

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 答案的数量对它们进行排序,然后将它们组合在一起,所以我应该得到来自这两个用户。

实际上,它给了我两个结果,但来自 Joe 的结果给了我两个值中较低的值 (2),Bob 首先得到 3 分。切换到 ASC 排序保持分数相同,但将 Joe 放在第一位.

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

【问题讨论】:

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


    【解决方案1】:

    你在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
    

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

    【讨论】:

    • 完美,谢谢。对谷歌来说有点困难,所以也感谢你的链接。
    【解决方案2】:

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

    对于您的查询,我建议:

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

    由于您的表格看起来非常非规范化,因此可以省略 group by name-par,但在其他情况下可能需要。

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

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2012-03-04
      • 2017-02-11
      相关资源
      最近更新 更多