簡體   English   中英

SELECT DISTINCT +來自兩列的匹配值=“unique”

[英]SELECT DISTINCT + matching values from two columns = “unique”

我知道標題的措辭很差,但我想不出更好的說法。

我正在學習Ruby並在MySQL上刷新。 我使用已完成航班的歷史列表作為練習數據集,大約有100,000行可供使用。 每個航班記錄包括始發地和目的地機場(字段'origin'和'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中完成嗎?

解決此問題的一種簡單方法是使用GREATEST()LEAST()返回這兩列中的哪個值根據列的排序規則進行更高或更低的排序。 然后他們總是返回相同的位置,而DISTINCT將重復刪除它們。

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

這是對sqlfiddle的行動

例如, LEAST('BOS', 'SFO')將始終返回'BOS' ,而GREATEST('BOS', 'SFO')將始終返回'SFO' 無論順序如何,當行並列時,結果都是相同的,因此DISTINCT將正確應用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM