【问题标题】:Finding the intersection between two columns查找两列之间的交点
【发布时间】:2016-12-06 01:55:36
【问题描述】:

我试图在 MySQL 的同一个表中找到两列之间的(集合)交集。我基本上想找到在表的 col2 中具有 col1 元素或在表的 col2 元素中的行col1

最初我尝试过:

SELECT * FROM table WHERE col1 IN (SELECT col2 FROM table)

这在语法上是有效的,但是运行时间太长了。表中的行数约为 300,000,有问题的两列未编入索引。我假设运行时间是 n^2 或 n^3,这取决于 MySQL 是否为表的每个元素再次执行子查询,或者是否临时存储子查询的结果。

接下来,我想到了合并两列并删除不同的元素,因为如果一个元素在此联合中出现多次,那么它一定存在于两列中(假设两列都只包含不同的元素)。

有没有更优雅(即更快)的方法来查找同一张表的两列之间的集合交集?

【问题讨论】:

  • 永远不要使用SELECT X FROM TABLE WHERE COLy IN (SELECT ...) IN (SELECT 查询在 MySQL 中非常慢,始终使用 @joe 所示的内连接。

标签: mysql sql


【解决方案1】:
SELECT t1.*
    FROM table t1
        INNER JOIN table t2
            ON t1.col1 = t2.col2

col1col2 上创建索引也将大大有助于此查询。

【讨论】:

  • 效果很好,谢谢!结果发现其中一列编入索引:D
【解决方案2】:

如果您只想要这些值,请尝试INTERSECT 命令:

(SELECT col1 FROM table) INTERSECT (SELECT col2 FROM table)

【讨论】:

    猜你喜欢
    • 2021-03-18
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2013-12-04
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多