检查同一MySQL表中的重复

检查同一MySQL表中的重复,mysql,sql,Mysql,Sql,我有上面的样品表。我想创建一个mysql查询来检查“icnum”的重复,一个摘要/计数和一个重复列表。什么 我想要的是: 在地区“20”中找到了地区“10”中的多少个“icnum”。 在区域“30”中找到了区域“10”中的多少个“icnum”。 在地区“30”中找到了地区“20”中的多少个“icnum” 我尝试了在stackoverflow中找到的几个查询,但它没有给出我想要的结果。我是复杂sql查询的新手 因此,我应该为每个地区分别执行查询以获得结果。请在stackoverflow中掌握MyS

我有上面的样品表。我想创建一个mysql查询来检查“icnum”的重复,一个摘要/计数和一个重复列表。什么

我想要的是:

在地区“20”中找到了地区“10”中的多少个“icnum”。
在区域“30”中找到了区域“10”中的多少个“icnum”。
在地区“30”中找到了地区“20”中的多少个“icnum”

我尝试了在stackoverflow中找到的几个查询,但它没有给出我想要的结果。我是复杂sql查询的新手

因此,我应该为每个地区分别执行查询以获得结果。请在stackoverflow中掌握MySQL,帮我解决这个问题。Tq

下面是我想要的示例输出:

id  district    icnum
 1     10       111
 2     10       112
 3     10       113
 4     10       114
 5     10       111
 6     20       115
 7     20       116
 8     20       117
 9     20       111
10     20       111
11     30       118
12     30       119
13     30       111
14     30       111
15     30       120

可以使用自联接来执行此操作:

district    district    count(*)
   10         20          2
   10         30          2
   20         30          2
选择t1.district、t2.district、count(不同的t1.icnum)
从t1连接
t2
在t1.icnum=t2.icnum和t1.district
注:

  • 如果没有重复项,请使用
    count(*)
    而不是
    count(*)
  • 这将不会返回没有共同点的对(尽管这是可以修复的)

这不是一个复杂的查询。看胡虎,那么我猜我是个彻头彻尾的无名小卒……使用我的样本数据,这与我在这里发布的数据大致相同,结果似乎翻了一番,这意味着在20区中得到了1个10区的icnum副本,但它显示了2,在第30区得到了第20区的3个icnum副本,但它显示了6..我想这是因为原始答案说,如果您有重复项,则使用
count(distinct)
。因为你知道,所以我做了第一个答案。我在我的实际表上使用这个查询,这个表大约有250万行。我执行了这个查询,差不多15分钟了,查询还在运行。这正常吗?@Shahril。这取决于你们的选区有多大。您可能会有一些地区有大量的icnum,您可能希望将其过滤掉。
select t1.district, t2.district, count(distinct t1.icnum)
from t t1 join
     t t2
     on t1.icnum = t2.icnum and t1.district < t2.district
group by t1.district, t2.district;