2012-08-27 1 views
0

데이터베이스 테이블 ('결과')에서 결과 목록을 얻으려고 시도하고 있지만 각 구성원이 여러 결과를 제출했을 수 있으며 가장 좋은 시간을 검색하려고합니다. .집계 함수가 동일하면 MySQL 그룹이 복수 결과를 반환합니다.

동일한 쿼리에서 동일한 결과를 얻은 결과가 여러 개인 경우를 제외하고 아래 쿼리는 효과적인지는 모르겠지만 작동합니다. (예 : 경쟁자 # 2는 32.15 초 두 번 점수를받습니다). 이 상황에서 필자는 필자가 원했던 것이 아니라이 경쟁자를 위해 두 줄을 얻는다. 이 문제를 해결하기 위해

SELECT result_id FROM ( 
    SELECT member_id,MIN(time) AS mintime FROM result 
     JOIN member_result ON result.id = member_result.result_id 
     WHERE event_id = ? 
     GROUP BY member_id ORDER BY mintime) AS x 
JOIN result ON result.time = x.mintime 
JOIN member_result ON member_result.result_id = result.id 
AND member_result.member_id = x.member_id 

모든 제안을 크게받을 수있다.

EDIT : 요청한 테이블의 구조.

member_result (TABLE) 
id int unsigned (10) 
result_id int unsigned (10) 
member_id int unsigned (10) 
club_id int unsigned (10) 

result (TABLE) 
id int unsigned (10) 
time decimal (6) 
is50mPool BIT() 
date date() 
verified BIT() 
verified_date timestamp() 
verified_comment varchar (255) 
hasEmailed BIT() 
enabled BIT() 
event_id int unsigned (10 
문제

샘플 : 결과 : 이벤트 # 2의 번호 # 1 시간 60 member_result : 번호 # 1, 1 result_id, MEMBER_ID 3 결과 : 이벤트 # 2 ID # 2 시간 60 member_result : id # 2, result_id 2, member_id 3

result_id와 함께 하나의 행을 반환하고 싶습니다. 현재 최소 시간이 동일하므로 두 행 모두 반환됩니다.

+0

이것은 "그룹 별 최소/최대"질문입니다. 유사한 질문은 여기에 전에 수백 번 문자 그대로 물어 보았습니다. 아마도 StackOverflow 전체에서 가장 중복 된 질문 일 것입니다. 비슷한 질문을 찾으려면 검색 기능을 사용하십시오. –

+0

나는 내 질문을 게시하기 전에 많은 검색을했다. 실제로 그것은 "그룹당 가장 적은/가장 큰"질문입니다. 그러나, 내가 찾은 다른 게시물에서 조인 작업이 없었으며 여기서는 여러 시나리오를 내 시나리오에 표시 할 수있었습니다. – mctedo

+1

테이블 구조, 샘플 레코드 및 원하는 결과를 포함 시키면 훨씬 좋습니다. MakeUseOf [* SQLFiddle *] (http://www.sqlfiddle.com) –

답변

0

실제로 이것은 외부 쿼리에 대해 다시 그룹화하는 것처럼 간단합니다. 이는 처음에 제한 조건 이전에 ORDER BY없이 LIMIT 문으로 인해 작동하지 않는 것으로 나타났습니다. GROUP BY 쿼리가 중단되었습니다.

SELECT result_id FROM ( 
SELECT member_id,MIN(time) AS mintime FROM result 
    JOIN member_result ON result.id = member_result.result_id 
    WHERE event_id = ? 
    GROUP BY member_id ORDER BY mintime) AS x 
JOIN result ON result.time = x.mintime 
JOIN member_result ON member_result.result_id = result.id 
AND member_result.member_id = x.member_id 
GROUP BY member_result.member_id 

기여한 모든 분들께 감사드립니다!

0
SELECT Distinct result_id FROM ( 
SELECT member_id,MIN(time) AS mintime FROM result 
    JOIN member_result ON result.id = member_result.result_id 
    WHERE event_id = ? 
    GROUP BY member_id) AS x 
JOIN result ON result.time = x.mintime 
JOIN member_result ON member_result.result_id = result.id 
AND member_result.member_id = x.member_id 

시도해 보셨습니까?

+0

에서 찾을 수있는 문제는 내가 반환 된 result_ids 두 가지 - 예를 들어, 나는 result_id # 1과 # 2를 얻을거야 - 그래서 별개 출력을 변경하지 않을 것입니다. – mctedo

1

편집 :

당신은 더 ID에 당신을 기계류되는 MIN 또는 MAX가 따라 사용하려고하고 하나 개의 행이 있습니다

:

같은 :

SELECT result_id FROM ( 
    SELECT member_id, MIN(member_result.id) as member_resultID ,MIN(time) AS mintime FROM result 
     JOIN member_result ON result.id = member_result.result_id 
     WHERE event_id = 2 
     GROUP BY member_id ORDER BY mintime) 
AS x 
JOIN result ON result.time = x.mintime 
JOIN member_result ON member_result.result_id = result.id 
AND member_result.id = x.member_resultID 

첫 번째 사용자에 대해 주어진 이벤트에 대한 MIN 시간 만 반환합니다. (따라서 두 행 대신 한 행 만)

그리고 여기에는 SqlFiddle입니다.

+0

위의 문제를 해결할 수 있지만 경쟁자가 여러 번 있지만 같지 않은 경우 MIN (member_result.id)이 반드시 일치하는 ID를 선택하지 않아 잠재적으로 어느 것도 선택되지 않는 새로운 문제가 발생합니다 최소 시간. (결과 ID # 19 시간 1 초, member_result # 15 member_id # 2, 결과 # 24 시간 0.01 초, member_result # 19 member_id # 2). – mctedo

관련 문제