2013-06-08 1 views
1

내가 MAX를 사용하여 근본적인 문제에 봉착 것 같다 -이 행의 내용을 혼합 것, 나는 생각한다.MySQL의 최대 기능을 혼합 행

id rev state 
1 100 pass 
1 99 fail 
1 98 fail 

결과가 있어야한다 :

은보기입니다

id rev state 
1 100 **pass** 

하지만 당신은 총을 가진 GROUP BY 절을 필요

id rev state 
1 100 **fail** 

SELECT r.id, r.state, MAX(r.revision) 
FROM VIEW_data r 
WHERE r.id=1 

답변

1

나는 아래의 질의에이를 수 MAX(). MySQL은 다른 RDBMS가 오류를보고하는 곳에서는 생략 할 수 있지만 표시되지 않은 결과는 생략 할 수 있습니다. 이것은 id 당 그룹화 rev을 반환하는 하위 쿼리에 가입하여 처리 할 수 ​​있습니다.

SELECT 
    r.id, 
    r.state, 
    maxrev.rev 
FROM 
    VIEW_data r 
    /* INNER JOIN against subquery which returns MAX(rev) per id only */ 
    JOIN (
    SELECT id, MAX(rev) AS rev 
    FROM VIEW_data GROUP BY id 
    /* JOIN is on both id and rev to pull the correct value for state */ 
) maxrev ON r.id = maxrev.id AND r.rev = maxrev.rev 
WHERE r.id = 1 

http://sqlfiddle.com/#!2/4f651/8

상기 임의 id 맥스 rev 값을 반환한다. 당신이 특정을 경우 그룹 당 MAX()보다는 WHERE 절에 의해 필터링으로 만 ORDER BY & LIMIT을 사용합니다 다른 답변을 보면, 하나 개의 행을해야합니다.

+0

이보십시오. 나는 여전히 쿼리가 내가 행의 내용을 섞어 놓는 이유를 이해하지 못한다. mysql 일 뿐인가요? – glutz

+1

그것은 너무 어쩌면, SQLite는 MySQL의 일이다 @glutz. 예를 들어 SQL Server에서 원래 쿼리를 시도한 경우 _r.id와 같은 오류는 GROUP BY_에 포함되어 있지 않으므로 SELECT 목록에 유효하지 않습니다. SELECT의 열은 GROUP BY에 있어야합니다. MySQL의 기본 동작에서는 필요하지 않으며, 행을 명확하게 선택할 수 없기 때문에 임의의 값을 선택하여 그룹을 채 웁니다. MySQL을 집계 함수를 배우는 사람들은 종종 등 오라클, MSSQL, 포스트 그레스, ... –

1

놀랍게도 작동합니까

SELECT r.id, r.state, r.revision 
FROM VIEW_data r 
WHERE r.id = 1 
ORDER BY r.revision DESC 
LIMIT 0,1 
+0

행운 작업을 시작할 때 그들에게 "올바른 방법"을 다시 배워야한다 - 이미 어쨌든 회전에 의해 주문입니다. – glutz