选择不同的+两列匹配值="唯一"

3

我知道标题措辞不太好,但是我想不到更好的说法了。

我正在学习Ruby并刷新MySQL。我使用一个已完成航班历史列表作为练习数据集,大约有10万行可供使用。每个航班记录包括出发地和目的地机场(字段“origin”和“dest”)以及总飞行距离(字段“distance”)。

作为一项练习,我想按照距离降序显示前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 中完成吗?

1个回答

3

一种简单的方法是使用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将正确应用。


这个返回了我想要的结果集,并且性能也还可以。谢谢。 - Dave B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接