假设以下数据:
数据:
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。感谢
答案 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)
如果他们分享了当天的最高分,那么这将显示多个学生。