2014-07-16 1 views
0

나는 MySQL 데이터베이스에 테이블이 있습니다 (weight). 다음 스냅 샷에서 볼 수 있습니다.추가 조건이있는 EXISTS를 사용하여 최대 행 얻기

weight 테이블 :

weight :

나는 다음과 같은 질의를 필요로한다.

SELECT * 
FROM weight w 
WHERE w.weight_id IN (SELECT MAX(ww.weight_id) 
         FROM weight ww 
         WHERE ww.weight BETWEEN 0 AND 60); 

는 언어 학적 weight 열은 0 (예를 들어) 60 사이의 값을 갖는 행 중에서 weight 표에서 최대 행을 얻었다.


EXISTS()을 사용하여 동일한 쿼리를 원합니다. 다음 시도는 성공하지 못합니다.

SELECT * 
FROM weight w 
WHERE NOT EXISTS (SELECT 1 
       FROM weight ww 
       WHERE w.weight_id < ww.weight_id 
         AND ww.weight BETWEEN 0 AND 60); 

은 최대 행합니다 (BETWEEN 조건 (AND ww.weight BETWEEN 0 AND 60)는 다음 생략되어있는 경우,이 테이블의 모든 행에서 최대 반환하지만 바람직하지부터 모든 행을 반환한다. 그것은 최대 행을 반환해야 BETWEEN 조건에 따라 필터를 적용한 후).

약간 수정 된 버전은 행을 반환하지 않습니다.

SELECT * 
FROM weight w 
WHERE EXISTS (SELECT 1 
       FROM weight ww 
       WHERE w.weight_id = ww.weight_id 
         AND ww.weight BETWEEN 0 AND 60 
         AND NOT EXISTS(SELECT 1 
            FROM weight www 
            WHERE ww.weight_id < www.weight_id)) 

EXISTS()을 계속 사용할 수 있습니까?

하위 쿼리가 FROM 절에서 지원되지 않는 ORM 프레임 워크를 사용하고 있습니다. 따라서 FROM의 하위 쿼리가 제외 된 경우 훨씬 더 좋습니다.

답변

0

일반적으로 id은 행 식별자로 사용해야하며 MAX()을 사용하지 않아야합니다.

당신이 가장 큰 weight 둘 사이의 값을 갖는 하나의 행하려면 다음

SELECT id, weight 
    FROM weight 
    WHERE weight BETWEEN 0 AND 60 
ORDER BY weight DESC 
    LIMIT 1 

나는이 경우에 EXISTS를 사용하지 것입니다.

UPDATE

당신이 다음 LIMIT을 사용할 수없는 경우 :

SELECT id, weight 
    FROM weight 
    WHERE weight = (
    SELECT MAX(wi.weight) 
     FROM weight wi 
    WHERE wi.weight BETWEEN 0 AND 60 
     ) 

당신은 당신이 시도 할 수 EXISTS를 사용하여 주장하는 경우 MAX(weight)

에 더 잘 속는 사람이없는 제공하는 동일한를 반환합니다 :

SELECT * 
    FROM weight w 
    WHERE NOT EXISTS (
    SELECT 1 
    FROM weight ww 
    WHERE w.weight < ww.weight 
     AND ww.weight BETWEEN 0 AND 60 
     ) 
    AND w.weight BETWEEN 0 AND 60 
+0

이 쿼리는 차례로 다른 관련 테이블 (다른 EXISTS()와 조인 일 수 있음)에서 다른 쿼리로 래핑 될 것입니다. 여기서 LIMIT 절은 sub-select 문에서 작동하지 않습니다 (나는 단순화를 위해 실제 시나리오를 게시하지 않았다). – Tiny