【问题标题】:MySQL select records for duplicates using multiple columnsMySQL使用多列选择重复记录
【发布时间】:2013-05-01 18:44:27
【问题描述】:

我想从表中选择记录,或者将它们插入到一个新的空白表中,其中多个列与数据库中的另一条记录相同。问题类似于这个问题。 Find duplicate records in MySQL 但是,这只比较一列。另外,我的一列,比如说下面示例中的 C 列,是一个整数。就像上面链接中的问题一样,我希望返回每一行。不幸的是,我对连接如何自己解决这个问题还不够熟悉。我知道下面的代码根本不像实际需要的 SQL 代码,这只是我能想到的最清晰的方式来描述我想要得到的比较。

SELECT ColumnE, ColumnA, ColumnB, ColumnC from table where (
  Row1.ColumnA = Row2.ColumnA &&
  Row1.ColumnB = Row2.ColumnB &&
  Row1.ColumnC = Row2.ColumnC
)

任何帮助将不胜感激,我看到的所有“从 MYSQL 中选择重复项”问题都只使用一列作为比较。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    如果要计算多列中的重复项,请使用group by

    select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates
    from table
    group by ColumnA, ColumnB, ColumnC
    

    如果您只想要重复的值,则计数大于 1。您可以使用 having 子句获得此值:

    select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates
    from table
    group by ColumnA, ColumnB, ColumnC
    having NumDuplicates > 1
    

    如果您确实希望返回所有重复的行,则将最后一个查询连接回原始数据:

    select t.*
    from table t join
         (select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates
          from table
          group by ColumnA, ColumnB, ColumnC
          having NumDuplicates > 1
         ) tsum
         on t.ColumnA = tsum.ColumnA and t.ColumnB = tsum.ColumnB and t.ColumnC = tsum.ColumnC
    

    这将起作用,假设所有列值都不是 NULL。如果是这样,请尝试:

         on (t.ColumnA = tsum.ColumnA or t.ColumnA is null and tsum.ColumnA is null) and
            (t.ColumnB = tsum.ColumnB or t.ColumnB is null and tsum.ColumnB is null) and
            (t.ColumnC = tsum.ColumnC or t.ColumnC is null and tsum.ColumnC is null)
    

    编辑:

    如果您有NULL 值,您还可以使用NULL-safe 运算符:

         on t.ColumnA <=> tsum.ColumnA and
            t.ColumnB <=> tsum.ColumnB and
            t.ColumnC <=> tsum.ColumnC 
    

    【讨论】:

    • 像往常一样出色的答案,但最后一个示例可以使用 MySQL 的“null-safe”等于运算符重写:on t.ColumnA &lt;=&gt; tsum.ColumnA and t.ColumnB &lt;=&gt; tsum.ColumnB and t.ColumnC &lt;=&gt; tsum.ColumnC
    • 这个答案似乎有效,但回报的数量与我的预期有很大不同。可能必须编写一些使用 for 循环的 java 来仔细检查它并给我一些想法。非常感谢您以这种方式格式化您的 SQL 代码,使用新行和缩进,它真的帮助我理解了您的代码实际上在做什么!
    • 后=已保存。谢谢 -> 你。
    【解决方案2】:

    你为什么不尝试使用联合或创建临时表。但就个人而言,我确实建议使用联合而不是创建临时表,因为这样做会花费您更长的时间。尝试这样做:

      select field1, field2 from(
       select '' as field2, field1, count(field1) as cnt FROM list GROUP BY field2 HAVING cnt > 1
        union
        select ''as field1, field2, cound(field2) as cnt from list group by field1 having cnt > 1
      )
    

    希望这是有道理的。:)

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 2013-12-17
      相关资源
      最近更新 更多