如何在MySQL中选取两列不重复的组合记录(双向视为同一)
MySQL 筛选不重复的城市往返组合
现有如下MySQL数据表:
| Fare | City1 | City2 | Dist |
|---|---|---|---|
| 100 | A | B | 10 |
| 100 | B | A | 10 |
| 200 | A | C | 20 |
| 150 | B | D | 15 |
| 150 | D | B | 15 |
需要选取City1与City2组合不重复的所有记录,其中A,B与B,A视为同一组合,期望输出如下:
| Fare | City1 | City2 | Dist |
|---|---|---|---|
| 100 | A | B | 10 |
| 200 | A | C | 20 |
| 150 | B | D | 15 |
方案1:用字符串比较筛选单向记录
直接通过字符串大小比较,只保留City1小于City2的记录,自动过滤反向的重复组合:
SELECT Fare, City1, City2, Dist FROM your_table_name WHERE City1 < City2;
如果存在单向城市组合(比如只有A-C没有C-A),可以补充语句包含这些记录:
SELECT Fare, City1, City2, Dist FROM your_table_name WHERE City1 < City2 UNION SELECT Fare, City1, City2, Dist FROM your_table_name WHERE City1 > City2 AND NOT EXISTS ( SELECT 1 FROM your_table_name t WHERE t.City1 = your_table_name.City2 AND t.City2 = your_table_name.City1 );
方案2:分组去重保留指定顺序
如果需要灵活控制保留哪一条记录(比如优先保留A-B而非B-A),用窗口函数配合统一分组键:
SELECT Fare, City1, City2, Dist FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY LEAST(City1, City2), GREATEST(City1, City2) ORDER BY City1 -- 按City1排序,确保A-B优先被保留 ) AS row_num FROM your_table_name ) temp WHERE row_num = 1;
调整ORDER BY子句可改变保留规则,比如按Fare DESC保留票价最高的记录。
方案3:DISTINCT统一城市顺序
如果不介意统一城市显示顺序(小字母在前),用DISTINCT快速去重:
SELECT DISTINCT Fare, LEAST(City1, City2) AS City1, GREATEST(City1, City2) AS City2, Dist FROM your_table_name;
内容的提问来源于stack exchange,提问作者user20826386
相关产品推荐
相关产品推荐

