我知道标题的措辞很糟糕,但我想不出更好的说法。
我正在学习Ruby,并在MySQL上提神。我使用一个已完成航班的历史列表作为实践数据集,大约有100,000行要处理。每一次飞行记录包括起始机场和目的地机场(字段“原产地”和“最优”)和总飞行距离(字段“距离”)。
作为一个练习,我想展示按距离下降排序的10条最长的路线。然而,我想把每对端点看作一个单一的路径,而不管哪个是起源,哪个是目的地。因此,例如,JFK和LAX应该被认为是一条单一的路由。
当我运行查询时:
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中完成吗?
发布于 2014-02-17 19:14:19
一种简单的方法是使用LEAST()返回这两列的任意值,根据列的排序规则排序更高或更低。然后,它们总是以相同的位置返回,并且DISTINCT会去复制它们。
SELECT DISTINCT
distance,
LEAST(origin, dest) AS endpoint1,
GREATEST(origin, dest) AS endpoint2
FROM flights f
ORDER BY distance DESC LIMIT 10例如,LEAST('BOS', 'SFO')总是返回'BOS',而GREATEST('BOS', 'SFO')总是返回'SFO'。无论顺序如何,当行被并列时,结果是相同的,因此DISTINCT将正确应用。
https://stackoverflow.com/questions/21837276
复制相似问题