2014-02-17 8 views
2

제목이 잘못 표현 된 것을 알고 있지만 더 좋은 방법을 생각할 수 없습니다.SELECT DISTINCT + 두 열의 일치 값 = "고유"

저는 Ruby를 배우고 MySQL을 새로 고칩니다. 저는 약 10 만 개의 행을 가지고 연습 데이터 세트로 완성 된 비행의 역사적인 목록을 사용하고 있습니다. 각 비행 기록에는 출발지 및 도착지 공항 (출발지 및 출발지)과 총 비행 거리 (필드 '거리')가 포함됩니다.

연습으로 거리가 먼 거리로 정렬 된 10 개의 가장 긴 경로를 표시하고 싶습니다. 그러나 원점과 대상 중 하나에 관계없이 각 엔드 포인트 쌍을 단일 라우트로 간주하려고합니다. 예를 들어, JFK-LAX와 LAX-JFK는 단일 경로로 간주되어야합니다. 내가 쿼리를 실행하면

: 물론

SELECT DISTINCT distance, origin, dest FROM flights ORDER BY distance DESC LIMIT 10; 

을 나는이 얻을 :

내가 원하는 것이 아니다
["2704", "BOS", "SFO"] 
["2704", "SFO", "BOS"] 
["2689", "BOS", "SJC"] 
["2689", "SJC", "BOS"] 
["2615", "LAX", "LIH"] 
["2615", "LIH", "LAX"] 
["2614", "HNL", "SAN"] 
["2614", "SAN", "HNL"] 
["2611", "BOS", "LAX"] 
["2611", "LAX", "BOS"] 

. "공항이 출발지 또는 목적지인지 여부에 관계없이 가장 긴 10 개의 노선의 거리와 종점을 선택하십시오."

내가 생각한 한 가지 생각은 각 끝점 쌍을 사전 순으로 정렬하여 함께 연결하여 고유 한 경로 (예 : LAX 및 JFK = "JFKLAX")를 만드는 것입니다. 그러나 나는 그것을 어떻게 수행하고 그것을 원래의 질의에 전달할 것인지, 또는 그것이 최선의 방법 일지는 모르겠다.

순전히 SQL/MySQL로 수행 할 수 있습니까?

답변

3

이 방법에 접근하는 간단한 방법 중 하나는 GREATEST() and LEAST() 두 열 중 어느 값이든 열의 데이터 정렬에 따라 더 높거나 낮은 정렬을 사용하는 것입니다. 그런 다음 그들은 항상 같은 위치에서 돌아오고 DISTINCT은 그것들을 중복 제거합니다. GREATEST('BOS', 'SFO') 항상 'SFO'를 반환하면서

SELECT DISTINCT 
    distance, 
    LEAST(origin, dest) AS endpoint1, 
    GREATEST(origin, dest) AS endpoint2 
FROM flights f 
ORDER BY distance DESC LIMIT 10 
예를 들어

Here it is in action on sqlfiddle

, LEAST('BOS', 'SFO') 항상 'BOS' 반환합니다. 순서와 상관없이 행이 병치 된 경우 결과는 동일하므로 DISTINCT이 올바르게 적용됩니다.

+0

허용되는 성능으로 원하는 결과 세트를 반환합니다. 감사. –

관련 문제