2010-11-24 3 views
3

는 다음과 같은 데이터를 가정MySQL : ORDER BY 다른 필드를 사용하여 행을 검색하는 필드로 GROUP 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가 BY ORDER 전에 일을 그래서 그것은 보이지 않고 주문을 적용 할 수 없습니다.

그래서 GROD BY에 ORDER를 적용 할 수 있습니까?

참고 : 참고 : 내 쿼리가 실제로 매우 복잡하기 때문에 가장 간단한 쿼리가 필요하다는 것을 명심하십시오. 일부 하위 쿼리 또는 조인으로이 결과를 얻을 수 있지만 주문 방법을 알고 싶습니다. GROUP BY. 감사합니다

+1

주문 전에 그룹이 발생 했으므로 하위 쿼리를 사용해야합니다. – faroligo

답변

2

이 예제에서는 Oracle을 사용했지만 SQL은 mysql에서 작동해야합니다 (mysql에서 작동하려면 to_date 항목을 조정해야 할 수도 있음). 당신이 묻고있는 일을하기 위해서는 여기에 서브 쿼리가 필요합니다.

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

감사합니다. 이러한 쿼리와 결과가 실제 것 같습니다. ORDER BY에서 DESC를 잊어 버린 것 같습니다. 결과를 수정하고 다시 보내 주시겠습니까? 당신의 현재 결과는 정확히 내가 얻은 결과입니다. – Alexar

+0

@takpar - 죄송합니다. 테스트 데이터를 삽입 할 때 Ronald에게 15 점이 없었기 때문에 결과가 잘못되었습니다. 그래서 쿼리가 정확했지만 내 테스트 데이터 삽입 코드가 잘못되었습니다 :). 또한 주문에 대한 DESC가 필요하지 않습니다. 날짜가 역순으로 되돌려지기 때문입니다 (예 : 최신 날짜는 가장 오래된 날짜 이전으로 되돌아갑니다). 원하는 결과에 따라 오름차순으로 날짜를 원하며 ASC는 오더의 기본 옵션이므로 지정하지 않아도됩니다. – dcp

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) 

이렇게하면 하루 동안 가장 높은 점수를 공유 한 학생이 여러 명 표시됩니다.