MySQL:如何GROUP BY一个字段来检索ORDER BY另一个字段的行?

时间:2010-11-24 14:28:08

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

假设以下数据:

数据:

    id  |   date        |   name    |   grade
--------+---------------+-----------+---------------
    1   | 2010/12/03    |   Mike    |   12
    2   | 2010/12/04    |   Jenny   |   12
    3   | 2010/12/04    |   Ronald  |   15
    4   | 2010/12/03    |   Yeni    |   11

我想知道谁在每一天都有最好的成绩,如下:

期望的结果:

    id  |   date        |   name    |   grade
--------+---------------+-----------+---------------
    1   | 2010/12/03    |   Mike    |   12
    3   | 2010/12/04    |   Ronald  |   15

我认为查询应该如下所示:

SELECT name FROM mytable
GROUP BY date
ORDER BY grade DESC

但它返回的内容如下:

当前不需要的结果:

    id  |   date        |   name    |   grade
--------+---------------+-----------+---------------
    1   | 2010/12/03    |   Mike    |   12
    2   | 2010/12/04    |   Jenny   |   12
我搜索了一下,然后找到了原因:

GROUP BY在ORDER BY之前发生,因此它看不到并且无法应用ORDER。

那么如何在GROUP BY上应用ORDER?

注意:请记住我需要最简单的查询,因为我的查询实际上非常复杂,我知道我可以通过一些子查询或JOINing来实现这个结果,但我想知道如何将ORDER应用于GROUP BY。感谢

2 个答案:

答案 0 :(得分:2)

我在这个例子中使用了Oracle,但SQL应该在mysql中工作(你可能需要调整to_date的东西才能使用mysql)。你真的需要一个子查询来做你想要的。

CREATE TABLE mytable (ID NUMBER, dt DATE, NAME VARCHAR2(25), grade NUMBER);

INSERT INTO mytable VALUES(1,to_date('2010-12-03','YYYY-MM-DD'),'Mike',12);
INSERT INTO mytable VALUES(1,to_date('2010-12-04','YYYY-MM-DD'),'Jenny',12);
INSERT INTO mytable VALUES(1,to_date('2010-12-04','YYYY-MM-DD'),'Ronald',15);
INSERT INTO mytable VALUES(1,to_date('2010-12-03','YYYY-MM-DD'),'Yeni',11);

    SELECT id
         , dt
         , name
         , grade
      FROM mytable t1
     WHERE grade = (SELECT max(grade)
                      FROM mytable t2
                     WHERE t1.dt = t2.dt)
    ORDER BY dt

结果:

ID  DT          NAME   GRADE
1   12/3/2010   Mike   12
2   12/4/2010   Ronald 15

答案 1 :(得分:0)

我知道你说你想要一个只有GROUP / ORDER的解决方案,但你需要在这个实例中使用一个子查询。最简单的方法是:

SELECT id, date, name, grade
FROM   mytable t1
WHERE grade = 
(SELECT MAX(t2.grade) FROM mytable t2 WHERE t1.id = t2.id)

如果他们分享了当天的最高分,那么这将显示多个学生。