2014-02-17 38 views
2

我知道標題的措辭很差,但我想不出有更好的方式說出來。SELECT DISTINCT +來自兩列的匹配值=「唯一」

我在學Ruby並在MySQL上刷新。我使用一份完整航班的歷史清單作爲練習數據集,約有100,000行可供使用。每個航班記錄包括起點和目的地機場(字段'起源'和'dest')以及總飛行距離(字段'距離')。

作爲一個練習,我想顯示按距離降序排列的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將對它們進行重複數據刪除。

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',而GREATEST('BOS', 'SFO')總是返回'SFO'。無論順序如何,當行並列時,結果是相同的,因此DISTINCT將正確應用。

+0

這會以可接受的性能返回我想要的結果集。謝謝。 –