扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
select user_name,count(*) as count from user_table group by user_name having count1;
在渭源等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、成都网站建设、外贸网站建设 网站设计制作按需求定制开发,公司网站建设,企业网站建设,成都品牌网站建设,营销型网站建设,成都外贸网站建设公司,渭源网站建设费用合理。
数据量如果很大的话就很麻烦,数据量小就可以用sql语句关联两张表把没有重复的查出来,然后再在把生产库中重复的数据的ID查出来再删除即可。
看到你的追问。数据库是20W级别的。
如果用O(n^2)的更新是肯定超时的。
计算次数是20W*20W*字符长度
我给你提个O(n)的思路,不过要用程序实现,SQL没机会。HQL或许有,但是不会。
首先是把A,B表中的都读到内存。
然后做哈希,开个10^10布尔类型的数组,1G内存多点,2G肯定够用。
然后做A表的哈希,
做好后遍历B表,做哈希。重复的做标记。
完成一轮后使用令一套保证跟第一次哈希不重复的哈希算法再遍历一次标记过的B表,
再遍历A表。
如此只需分别遍历两次AB表,即可完成查重。
然后把B表中重复的删掉即可。
计算机的执行效率大约是每秒10000*10000次。
如果把AB表中的string型主键转成int型存储,然后再做比对。
大约是20W*20W*2的比对次数,那么800秒,就是20到40分钟。
都应该可以比对完,但是如果是如题描述的12位字符。就需要几个小时甚至几天了。
再说一种O(Nlog2N)的算法。
首先是对A,B进行合并,然后做快排序。
然后遍历一次进行顺序查重。
这种方法用的内存比较少,计算量是40W*100,基本上10秒内都能出结果。
select * from 用户表 where 用户名 in (select 用户名 from 用户表 group by 用户名 having count(1)1)
对mysql快速批量修改,查重
更新
UPDATE mytable
SET myfield = CASE id
WHEN 1 THEN 'value'
WHEN 2 THEN 'value'
WHEN 3 THEN 'value'
END
WHERE id IN (1,2,3)
查重
select t.* from vinstatic t inner JOIN (select vin, count(0) num from vinstatic group by vin) t1 on t.VIN=t1.vin where t1.num1
假设ID是表的关键字段,TopicID是回复所属的主题ID字段,其中1是变化的值,那么可以使用以下语句就可以了select count(ID) from bbs where topicID=1
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流