2014-10-21 6 views
0

쿼리와 관련된 문제, 특히 GROUP BY 함수에 문제가 있습니다.MySQL GROUP BY incoherence

쿼리가 완벽하게 작동하고 올바른 순서로 올바른 결과를 반환하지만 사용자 ID별로 그룹화하려고하면 모든 것이 엉망입니다. 나는 단지

문제는 다음과 같습니다

SELECT u.ID, GREATEST(IF(c.climb_length >= 1, r.cotation_1, 0) 
, IF(c.climb_length >= 2, r.cotation_2, 0) 
, IF(c.climb_length >= 3, r.cotation_3, 0) 
, IF(c.climb_length >= 4, r.cotation_4, 0) 
, IF(c.climb_length >= 5, r.cotation_5, 0) 
, IF(c.climb_length >= 6, r.cotation_6, 0) 
, IF(c.climb_length >= 7, r.cotation_7, 0) 
, IF(c.climb_length >= 8, r.cotation_8, 0) 
, IF(c.climb_length >= 9, r.cotation_9, 0) 
, IF(c.climb_length >= 10, r.cotation_10, 0) 
) AS vmax 
FROM users u 
INNER JOIN climbs c 
ON c.user_id = u.ID 
INNER JOIN routes r 
ON c.route_id = r.ID 
GROUP BY vmax, u.ID 
ORDER BY vmax DESC 

이것은 (읽기 쉽도록 표시 사용자 이름) 중복 u.IDs을 제외하고, 내가 원하는에 가까운 그런 일을 반환 u.ID 당 가장 높은 vmax를 원합니다 - 각 u.ID는 한 번만 나타납니다. 나는이 같은 요청을 할 경우에 따라서 만 GROUP BY u.ID으로, 나는 말이없는이 얻을 :

여기서 VMAX 값이 따라서 순서가 잘못 잘못이다. 심지어 그 값이 어디서 왔는지도 모르겠다. 각 u.ID의 vmax 값은 쿼리에 의해 계산 된대로 각 사용자의 마지막으로 삽입 된 vmax와 일치하지 않습니다. 을 SELECT 부분에 추가하면 표시 할 수 있습니다. , 첫 번째도 아니다. 그들은 각 사용자에게 속하지만, 연대순으로 모든 곳에 있습니다.

많은 것을 시도해 보았습니다. (예를 들어, this link은 유망 해 보였습니다). 그러나이 마지막 비트가 작동하지 않는다고 생각합니다. 내가 엉망인 곳을 누가 보지?

감사합니다. 단지 u.ID에 의해

+0

는 정확하고 당신의 기대에 따라 첫 번째 결과인가? 그리고 산출물의 문제점은 정확히 무엇입니까? –

+0

'MAX (가장 큼 (...))'을 시도 했습니까? –

+0

@RohitAggarwal 첫 번째 결과의 문제점은 중복 ID입니다. 각 사용자는 한 번만 나타납니다. 그래서 순서는 괜찮지 만 다른 결과를 없애고 싶습니다! – frsechet

답변

2

를 사용하여 집계 함수 MAX 그룹 :

SELECT u.ID, MAX(GREATEST(IF(c.climb_length >= 1, r.cotation_1, 0) 
, IF(c.climb_length >= 2, r.cotation_2, 0) 
, IF(c.climb_length >= 3, r.cotation_3, 0) 
, IF(c.climb_length >= 4, r.cotation_4, 0) 
, IF(c.climb_length >= 5, r.cotation_5, 0) 
, IF(c.climb_length >= 6, r.cotation_6, 0) 
, IF(c.climb_length >= 7, r.cotation_7, 0) 
, IF(c.climb_length >= 8, r.cotation_8, 0) 
, IF(c.climb_length >= 9, r.cotation_9, 0) 
, IF(c.climb_length >= 10, r.cotation_10, 0) 
)) AS vmax 
FROM users u 
INNER JOIN climbs c 
ON c.user_id = u.ID 
INNER JOIN routes r 
ON c.route_id = r.ID 
GROUP BY u.ID 
ORDER BY vmax DESC 
+0

저는 완전히 논리적 인 MAX로 백만 번 시도했지만 어떤 이유로 항상 오류를 반환했습니다. 물론 이것은 오타 였음에 틀림 없다. :-) 고마워! – frsechet