>  Q&A  >  본문

GROUP BY 한 필드와 ORDER BY 다른 필드가 있는 MySQL SELECT

편집 3 - MySQL 버전은 8.0.33입니다.

편집 2 - 하단에서 최종 작업 코드를 확인하세요. @Akina님 감사합니다!

스포츠 경기에 대한 점수표가 있습니다. 테이블에는 내가 선택하고 싶은 세 가지 관련 필드가 있습니다 -

  1. scoreID 기본 키 값으로
  2. classifierID 특정 코스 레이아웃에 대한 세부 정보가 포함된 다른 테이블의 기본 키에 매핑됩니다.
  3. calculatedPercent은 특정 이벤트
  4. 의 결과입니다.

이 테이블에는 WHERE 절에서 사용하는 세 가지 다른 필드가 있지만 이는 부수적인 것입니다.

calculatedPercent 选择四个最佳值,并规定 classifierID 不能重复。我需要能够捕获 scoreID에 가장 적합한 네 가지 값을 선택하고

가 반복될 수 없음을 지정하는 쿼리를 생성해야 합니다. 프로세스의 후반 단계에서 사용할 수 있도록

캡처할 수 있어야 합니다.

첫 번째 쿼리입니다. calculatedPercent 值的行选择了 scoreID 值。然后我注意到有几个成员在同一门课程上获得了第一和第二高分,这违反了 classifierID 으아악

처음에는 특정 회원에 대해 가장 높은

값을 가진 행을 선택하기 때문에 이것이 훌륭하다고 생각했습니다. 그러다가 여러 회원이 동일한 코스에서 첫 번째와 두 번째로 높은 점수를 받았음을 발견했습니다. 이는 값 중복 금지라는

요구 사항을 위반한 것입니다.

SELECT DISTINCT를 시도해 보았지만 결국 나에게 정말로 필요한 것은 GROUP BY라는 것을 깨달았습니다. 그래서 조사를 해보니 MySql에서 쿼리를 실행할 때 only_full_group_by와 관련된 오류가 발생하는 것을 발견했지만 문제가 완전히 해결되지는 않았습니다.

다음에 시도한 것:
으아악

다음 오류 메시지입니다:

#1055 - ORDER BY 절의 표현식 #1은 GROUP BY 절에 없으며 GROUP BY 절의 열에 기능적으로 종속되지 않는 비집계 열 ".masterScores.calculatedPercent"를 포함합니다. 이는 일관성이 없습니다. sql_mode=only_full_group_by는 호환되지 않습니다masterScores.scoreID 列使用 MIN 和 MAX,但它与预期不符; scoreID 主键值并不总是所选 calculatedPercent 的值。我在某处读到,因为 scoreID

masterScores.scoreID 열에 MIN 및 MAX를 사용하는 것을 고려했지만 예상대로 작동하지 않습니다.

기본 키 값이 항상 선택한

값이 아닙니다.

가 기본 키이므로 ANY_VALUE 집계를 사용하여 이 문제를 해결할 수 있다는 내용을 어딘가에서 읽었습니다. 나는 이것을 시도했다:
    으아악
  1. 얼핏 보면 작동하는 것처럼 보이지만 항상 bestPercent 값과 일치하는

    값을 반환하지는 않습니다. classifierID 选择 1 个 calculatedPercent 和 1 个 scoreID 值。如果不按 classifierID 分组,则每个 classifierID

    다시 말하지만 목표는 다음과 같습니다.
  2. classifierID 所选的 calculatedPercent지정된 WHERE 절을 기준으로 각

    에 대해 1
  3. 및 1
  4. 값만 선택합니다.

    로 그룹화하지 않으면 각 calculatedPercent는 WHERE 절을 만족하는 0~400개의 행을 가질 수 있으므로 여기서는 GROUP BY가 적절하다고 생각합니다.

  5. 각 그룹에 대해 선택한 calculatedPercent

    이 모든 옵션 중에서 가장 높은 값인지 확인하세요🎜 🎜 🎜🎜4개의 행만 선택하고 이 행이 가장 높은 🎜 값을 가진 행인지 확인하세요. 🎜 🎜 🎜🎜선택한 4개의 행이 🎜 값을 기준으로 내림차순으로 정렬되어 있는지 확인하세요. 🎜
  6. 선택한 각 행에 대해 동일한 행을 보장 scoreID 值实际上代表与选定的 calculatedPercent합니다(현재는 이 지점이 백분율이 계산되고 쿼리가 실패하는 지점입니다).

다음은 데이터의 하위 집합입니다. 예:

점수 ID 분류자 ID 최고의 백분율
58007 42 66.60
63882 42 64.69
64685 54 64.31
58533 32 63.20
55867 42 62.28
66649 7 56.79
55392 12 50.28
58226 1 49.52
55349 7 41.10

쿼리를 실행할 때 원하는 출력은 다음과 같습니다.

점수 ID 분류자 ID 최고의 백분율
58007 42 66.60
64685 54 64.31
58533 32 63.20
66649 7 56.79

쿼리를 실행할 때의 실제 출력은 다음과 같습니다.

점수 ID 분류자 ID 최고의 백분율
55867 42 66.60
64685 54 64.31
58533 32 63.20
55349 7 56.79

그림과 같이 실제 출력의 첫 번째 행과 네 번째 행의 scoreID 값이 올바르지 않습니다.

지금은 어떤 제안이라도 환영합니다.

편집 2 - 최종 작업 솔루션

으아아아

문제가 발생한 6가지 사례에 대해 이를 테스트할 수 있었고 솔루션으로 모든 문제가 해결되었습니다. @Akina에게 다시 한 번 감사드립니다!

이 문제는 해결된 것으로 표시됩니다.

P粉715274052P粉715274052405일 전526

모든 응답(1)나는 대답할 것이다

  • P粉696891871

    P粉6968918712023-09-11 13:48:48

    으아악

    (classifierID,calculatedPercent) 不唯一,那么每个classifierID 경우 여러 회선을 받을 수 있습니다. 이 경우에는

    가 필요합니다. 으아악 추신. MySQL 버전이 8 이상인 경우 하위 쿼리 대신 CTE에 ROW_NUMBER()를 사용해야 합니다.


    으아악

    회신하다
    0
  • 취소회신하다