MySQL: Как GROUP BY поле, чтобы получить строки с ORDER BY другого поля? - PullRequest
3 голосов
/ 24 ноября 2010

предположим, что следующие данные:

Данные:

    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.

, так как я могу применить ORDER к GROUP BY?

Примечание: имейте в виду, что мне нужен самый простой запрос,Поскольку мой запрос на самом деле очень сложный, я знаю, что могу достичь этого результата с помощью некоторого подзапроса или СОЕДИНЕНИЯ, но я хочу знать, как применить ORDER к GROUP BY.спасибо

Ответы [ 2 ]

2 голосов
/ 24 ноября 2010

Я использовал 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
0 голосов
/ 24 ноября 2010

Я знаю, что вы сказали, что вам нужно решение только для GROUP / ORDER, но вам нужно будет использовать подзапрос в этом случае.Самым простым способом было бы что-то вроде этого:

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

Это показало бы несколько учеников, если они делили самую высокую оценку за день.

...