2012-12-11 3 views
0

에서 값을 비교하기 위해 필요한이 내 테이블 :내 MySQL 쿼리 확장. 다른 행과 열

enter image description here

나는 그것에서 코드와 번호를 선택하려면이 내 쿼리의 시각화 :

enter image description here

그리고 쿼리입니다 :

SELECT Code,Number,(1894 - Limit1) AS spread1,(Limit2 - 1894) AS spread2 
FROM MyTable WHERE Name="John" AND 600>=L1 AND 600<=L2 
AND 1894>=Limit1 AND 1894<=Limit2 

파이 이 질의는 두 개의 값을 반환하며 하나만 필요합니다. 그래서 ROW2에서 spread1ROW1에서 spread2을 비교하고 코드와 더 큰 확산의 번호를 가지고이 경우에는 spread2 야한다.

이유는 그들의 자아를 중복되기 때문에 내가 ROW2에서 ROW1에서 spread2spread1입니다 비교입니다. 그래서, 그 중복 내에서 스프레드를 비교 해요 :

enter image description here

을 내 쿼리 내가, 그 결과로 하나 또는 두 개의 행을 결코 더 얻을 수 있습니다 위에서. 왜? 그 식으로 테이블이 만들어지기 때문입니다. 하나의 행이 결과로 나타나면 어떤 비교도 필요하지 않을 것입니다. 즉, 단일 코드와 숫자가 있다는 것을 의미합니다.

결론적으로 위에서 언급 한 작업을 수행하려면 쿼리를 확장해야합니다. 나는 무엇을 시도했다

추가하는 것입니다

ORDER BY (spread2,spread1) DESC LIMIT 1 

와 나는 같은 행에서 알엇 오히려 원하는대로 값을 비교하지 않는다는 것을 확신합니다.

+0

왜 스프레드 2를 스프레드 1과 비교하고 있습니까? 결과에 3 개의 행이 있다면 어떻게 될까요? 또한, '코드와 더 큰 스프레드를 취하십시오'는 3006> 1144를 기록하므로 3006을 반환해야합니다. 맞습니까? –

+0

귀하의 사진은 나에게 이해가되지 않습니다. 그것에 대해 설명해 주시겠습니까? –

+0

왜 '1144'와 '3006'이 고려되지 않습니까? –

답변

0

해결! 값 1 = 600, 값 2 = 1894의 경우

:

SELECT number,code,(spread2)AS spread FROM(SELECT number,code,@curRow := @curRow + 1 AS RowNumber, (1894 - Limit1) AS spread1,(Limit2 - 1894) AS spread2 
FROM MyTable JOIN (SELECT @curRow := 0) r WHERE name="John" AND 600>=L1 AND 600<=L2 AND 1894>=Limit1 AND 1894<=Limit2)temp WHERE RowNumber=1 
UNION 
SELECT number,code,(spread1)AS spread FROM(SELECT number,code,@curRow := @curRow + 1 AS RowNumber, (1894 - Limit1) AS spread1,(Limit2 - 1894) AS spread2 
FROM MyTable JOIN (SELECT @curRow := 0) r WHERE name="John" AND 600>=L1 AND 600<=L2 AND 1894>=Limit1 AND 1894<=Limit2)temp WHERE RowNumber=2 
ORDER BY spread DESC limit 1 

때 값 1 = 950과 값 2 = 2400 :

SELECT number,code,(spread2)AS spread FROM(SELECT number,code,@curRow := @curRow + 1 AS RowNumber,(2400 - Limit1) AS spread1,(Limit2 - 2400) AS spread2 
FROM MyTable JOIN (SELECT @curRow := 0) r WHERE name="John" AND 950>=L1 AND 950<=L2 AND 2400>=Limit1 AND 2400<=Limit2)temp WHERE RowNumber=1 
UNION 
SELECT number,code,(spread1)AS spread FROM(SELECT number,code,@curRow := @curRow + 1 AS RowNumber,(2400 - Limit1) AS spread1,(Limit2 - 2400) AS spread2 
FROM MyTable JOIN (SELECT @curRow := 0) r WHERE name="John" AND 950>=L1 AND 950<=L2 AND 2400>=Limit1 AND 2400<=Limit2)temp WHERE RowNumber=2 
ORDER BY spread DESC limit 1 

그리고 그 결과로 하나 개의 행을 얻을 때 그것은 또한 작동합니다.