2016-10-01 2 views
0

기본적으로 하나의 테이블 (테스트 DB)이있는 간단한 데이터베이스가 있습니다. 난 할 노력하고있어 (내가 요구하고있어 그 이유는 아주 간단합니다 SQL 예기치 않은 반환

  • OralGrade에게
  • WrittenGrade
    • ID
    • 이름 : 표는 4 열이 귀하의 도움) : 나는 의 이름을평균의 가장 높은 평균을 얻고 싶습니다.

      내가 시도하는 것 :

      SELECT nom, MAX(avg) 
          FROM ( 
           SELECT nom, (noteOrale + noteEcrit)/2 as avg 
           FROM etudiant 
           GROUP BY nom) AS Table; 
      

      이 쿼리를 시도 후에는 이름에 해당하지 않는 나에게 이름평균하지만 평균를 반환했습니다.

      누군가 포인터를 주거나 잘못 된 점을 설명해 줄 수 있습니까? - 그래서 당신의 쿼리가 단지 이름에 대한 임의의 값을 반환

      SELECT nom, avg 
      FROM (
          SELECT nom, (noteOrale + noteEcrit)/2 as avg 
          FROM etudiant 
          GROUP BY nom 
      ) t 
      ORDER BY avg DESC 
      LIMIT 1 
      

      mysql 당신이 group by 절에 모든 비 집계 열을 포함하지 않고 집계를 사용할 수 있습니다 : 난 그냥 이것에 대한 limit을 사용합니다 감사합니다

    답변

    2

    order bylimit을 사용하십시오. 어떤 하위 쿼리는 필요하지 않습니다 :

    SELECT nom, (noteOrale + noteEcrit)/2 as avg 
        FROM etudiant 
        ORDER BY avg DESC 
        LIMIT 1; 
    

    그것은 값이 모두 한 행에 있기 때문에 더 GROUP BY가 하나 필요하지 않습니다 것으로 나타납니다.

    여러 행인 경우 GROUP BY이 필요합니다.

    +0

    도와 주셔서 감사합니다. 나는 당신의 답을 약간 더 간단하기 때문에 정확한 답으로 답합니다. –

    1

    .

    +0

    두 답변 모두 완벽하게 작동합니다. @Gordon Linoff의 답을 올바른 것으로 표시하겠습니다. –

    0

    nom에 대해 반환 된 값이 인 경우 0이 아니면입니다. MAX() 집계를 사용하면 쿼리가 모든 행을 축소하고 평균 값이 가장 높은 값을 찾습니다. 그 부분이 효과가 있습니다.

    그러나 nom 반환 값이 에서 축소 된 그룹의 일부 행, 반드시 avg의 가장 높은 값을 갖는 행. 질의는 기본적으로 nom의 값을 에서 어떤 그룹의 행으로 반환하도록 MySQL에게 명령했습니다.

    다른 데이터베이스는 "GROUP BY가 아닌 SELECT 목록에 집계가 아닙니다"라는 오류 메시지와 함께 쿼리에 오류가 발생합니다.

    비표준 MySQL 관련 확장을 사용하면 쿼리를 실행할 수 있습니다. (우리가 ONLY_FULL_GROUP_BY를 sql_mode에 포함 시키면, 다른 데이터베이스처럼 MySQL을 표준에 가깝게 접근 할 수 있습니다. 확장 기능을 사용하지 않으면 MySQL은 다른 데이터베이스처럼 동작하고 오류를 반환합니다.)

    "예상치 못한"동작이 나타나는 이유입니다.

    (이것은 당신이 묻는 질문에 대한 답 ... 무엇이 잘못되었는지 설명.)

    -1

    그냥 두 필드의 합이 모든 행의 두 필드의 higest 합과 같다 행을 나열합니다. 2로 나눌 필요가 없습니다. 그것은 단지 스케일링입니다.

    Select * from table 
    Where noteOrale + noteEcrit = 
        (Select Max(noteOrale + noteEcrit) 
        From table) 
    

    계산 된 avg도 출력에 포함하려면 select 절에 추가하십시오.

    Select nom, noteOrale, noteEcrit, 
        (noteOrale + noteEcrit)/2 Avg 
    from table 
    Where noteOrale + noteEcrit = 
        (Select Max(noteOrale + noteEcrit) 
        From table) 
    
    관련 문제