【问题标题】:Fast way to get the difference of 2 columns in MySQL在 MySQL 中获取 2 列差异的快速方法
【发布时间】:2009-05-25 07:16:16
【问题描述】:

如何获取另一列中不匹配的列的字段?

我试过了:

SELECT table1.page_title 
FROM table1, table2 
WHERE table1.page_title != table2.page_title

它会产生很多重复的字段,所以我做了一个:

SELECT DISTINCT table1.page_title 
FROM table1, table2 
WHERE table1.page_title != table2.page_title

但它只是挂起。

任何帮助将不胜感激,谢谢!

附: 我这样做是为了为 mediawiki 的 MWDumper 工具创建一个排除列表。我需要它,这样当我导入输出的 sql 时,我当前的 wiki 条目不会被覆盖。

编辑: 是的,它们是两张不同的桌子。每个都有大约 70,000 多条记录 另外为什么我的查询很慢?如果有人能澄清一下,我将不胜感激,以便我了解原因:) 再次感谢!

【问题讨论】:

  • 请说明 a 和 b 是什么。它们是不同的表吗?它们是同一张表的两个别名吗?

标签: sql mysql mediawiki


【解决方案1】:

a 和 b 是不同的表,都有“page_title”列吗?

如果是这样,试试这个:

SELECT DISTINCT page_title FROM a
WHERE page_title NOT IN (SELECT page_title FROM b)

如果您只对删除重复项感兴趣(如果您只有一个表),那么有几种方法可以做到,其中两种是:

SELECT DISTINCT page_title FROM a

SELECT page_title FROM a
GROUP BY page_title

GROUP BY 选项更强大,但速度更慢 - 您可以添加 HAVING 子句以仅选择那些出现的标题,例如两次以上:

SELECT page_title FROM a
GROUP BY page_title
HAVING COUNT(page_title) > 2

希望有帮助

(感谢 Aaron F 的评论)

【讨论】:

    【解决方案2】:

    您可以尝试我过去使用过的自联接,但我不确定这是否会更快,因为我不使用 MySQL。此页面可能会给您一些见解:http://www.xaprb.com/blog/2006/10/11/how-to-delete-duplicate-rows-with-sql/

    【讨论】:

      【解决方案3】:

      对 Rax 的回答略有改进:

      SELECT DISTINCT a.page_title FROM a
      WHERE a.page_title NOT IN (SELECT DISTINCT b.page_title FROM b)
      

      您的表格是否在其 page_title 列上有索引?解释计划对您的查询有何说明?

      鉴于您的表中只有 70k 行,我无法想象您仍然需要索引。

      【讨论】:

      • 谢谢,第一个查询显然必须有 DISTINCT
      【解决方案4】:

      你可以通过加入来做到这一点:

      SELECT DISTINCT table1.page_title 
      FROM table1
      LEFT JOIN table2 
          ON table1.page_title = table2.page_title
      WHERE table2.page_title is null
      

      如果速度慢,在 (table2.page_title) 上添加索引

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        • 2012-06-15
        • 1970-01-01
        相关资源
        最近更新 更多