You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中选取两列不重复的组合记录(双向视为同一)

MySQL 筛选不重复的城市往返组合

现有如下MySQL数据表:

FareCity1City2Dist
100AB10
100BA10
200AC20
150BD15
150DB15

需要选取City1与City2组合不重复的所有记录,其中A,B与B,A视为同一组合,期望输出如下:

FareCity1City2Dist
100AB10
200AC20
150BD15

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:20:36