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等于当前行的col1EXISTS (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
相关产品推荐
相关产品推荐

