一尘不染

MySQL使用多列为重复选择记录

mysql

我想要从表中选择记录,或将它们插入新的空白表中,其中多个列与数据库中的另一条记录相同。问题类似于此问题。
在MySQL中查找重复记录
但是,仅比较一列。另外,我的一列,例如下面的示例中的C列,是整数。就像上面链接中的问题一样,我希望返回每一行。不幸的是,我对联接如何如何自行解决还不够熟悉。我知道下面的代码与实际的SQL代码完全不同,这只是我可以想到的最清晰的方式来描述我要进行的比较。

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

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


阅读 316

收藏
2020-05-17

共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
2020-05-17