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

MySQL单表中筛选两列存在共同值的行的方法

嘿,我来帮你搞定这个筛选需求!你要的是找出那些某一值同时出现在col1和col2列中的行——看你的示例里,行1(e在两列都有)、行2(b在两列都有)、行5(e在两列都有)正好符合这个逻辑对吧?下面给你几个不需要复杂多表关联的简洁可行方案:

方法1:用IN子句直接筛选

这是最直观的写法,逻辑清晰易懂:

SELECT *
FROM your_table
WHERE col1 IN (SELECT col2 FROM your_table)
   OR col2 IN (SELECT col1 FROM your_table);

逻辑说明:

  • 第一部分col1 IN (SELECT col2 FROM your_table):检查当前行的col1值是否存在于整个表的col2列中
  • 第二部分col2 IN (SELECT col1 FROM your_table):检查当前行的col2值是否存在于整个表的col1列中
  • 只要满足其中一个条件,该行就会被选中。代入你的示例数据,正好会筛选出行1、行2、行5。

方法2:用EXISTS子查询(大数据量更高效)

如果你的表数据量比较大,EXISTS的性能会比IN更优,因为它找到第一个匹配项就会停止搜索,不用遍历整个子查询结果:

SELECT t.*
FROM your_table t
WHERE EXISTS (SELECT 1 FROM your_table WHERE col2 = t.col1)
   OR EXISTS (SELECT 1 FROM your_table WHERE col1 = t.col2);

逻辑说明:

  • EXISTS (SELECT 1 FROM your_table WHERE col2 = t.col1):判断是否存在任意一行的col2等于当前行的col1
  • EXISTS (SELECT 1 FROM your_table WHERE col1 = t.col2):判断是否存在任意一行的col1等于当前行的col2
  • 同样满足任一条件就会选中该行,结果和方法1完全一致。

方法3:用CTE先提取两列的交集值

如果你想先明确知道哪些值是同时存在于col1和col2中的,可以先用CTE提取这些共享值,再基于它们筛选行:

WITH shared_values AS (
    SELECT col1 AS val FROM your_table
    INTERSECT
    SELECT col2 AS val FROM your_table
)
SELECT *
FROM your_table
WHERE col1 IN (SELECT val FROM shared_values)
   OR col2 IN (SELECT val FROM shared_values);

逻辑说明:

  • INTERSECT会找出同时出现在col1和col2里的所有值(你的示例里就是b和e)
  • 之后只要行的col1或col2是这些共享值之一,就会被筛选出来,最终结果也是你要的那三行。

以上三种方法都能完美解决你的需求,你可以根据自己的表大小和个人习惯选择使用~

内容的提问来源于stack exchange,提问作者Urs von Ballmoos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:50