SELECT DISTINCT +来自两列的匹配值=“unique”

时间:2014-02-17 19:06:30

标签: mysql sql

我知道标题的措辞很差,但我想不出更好的说法。

我正在学习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中完成吗?

1 个答案:

答案 0 :(得分: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将正确应用。