清除mysql重复记录

andyzsy 2002-08-29 04:51:16
我有一个mysql数据表,现在里面有很多记录,关键字也比较多,十多个,


现在表里面有很多记录是重复的(我说的重复是指:两条记录的所有关键字下的内容完全一样),


请问我该怎么做才能删除重复的信息?

请指教!

用mysql命令或是php语句都可以!
================================================================

CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!

★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。

★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。

Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]

...全文
876 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
vivanboy 2002-08-31
  • 打赏
  • 举报
回复
to 版主:
本来以为你的group by有问题,结果竟然是正确的。因为sqlserver里面group by必须有聚合函数配合,mysql竟然没有这个限制。
不过你创建临时表错误,因为那不叫临时表,只是一个中间表而已。

完整的sql语句:
create table tmp as select * from tableName group by key1,key2
alter table tmp rename youtable(我的mysql3.23就支持)

xizi2002 2002-08-30
  • 打赏
  • 举报
回复
alexxing(赤铸):同意
alexxing 2002-08-30
  • 打赏
  • 举报
回复
临时表可行,问题是你的主机不见得支持

最老实的办法:

对表中的每个纪录,逐个与以前所有的纪录比较,发现有与当前纪录相同的,就删除当前纪录

全删除完后,可以用 OPTIMIZE TABLE tbl_name 优化
(OPTIMIZE 只能帮助你优化,不能帮助你完成去掉重复纪录的功能)
vivanboy 2002-08-30
  • 打赏
  • 举报
回复
array_unique($arr)返回数组中独一无二的值的数组
array_shift($arr)将数组第一个元素踢出去
in_array($var,$array);判断$var是否为$array的一个元素,$var可以为数组
andyzsy 2002-08-30
  • 打赏
  • 举报
回复
array_unique();
array_shift();
in_array();

谁能解释下这几个函数的意思,

最近小弟经常看见别人用数组方面的函数,但都看不懂,谁能指点下在那有这方面的文章可以看看,谢谢!
vivanboy 2002-08-30
  • 打赏
  • 举报
回复
用临时表的话
关键是你如何生成临时表并且同时能够删除那些关键字key1,key2段重复?

谁能写出sql语句,就算成功!各位不能只会说而不会写
vivanboy 2002-08-30
  • 打赏
  • 举报
回复
我的代码不就是删除key1,key2....重复的记录吗!

上面各位能否有点新意?!
能否用sql语句来实现?
_Shakespeare 2002-08-30
  • 打赏
  • 举报
回复
回楼上各位:
谢谢指教optimize的用法---试验中
楼主的问题用临时表是比较好的解决方法
新建一个临时表
create table tmp as select * from youtable group by name
删除原来的表
drop table youtable
重命名表
alter table tmp rename youtable(mysql4.0.2版本以上支持!!!!!)

其中的name也就是重复的字段

vivanboy 2002-08-29
  • 打赏
  • 举报
回复
OPTIMIZE TABLE tbl_name

如果你删除了一个表的大部分或如果你用变长的行对一个表(有VARCHAR、BLOB或TEXT列的表)做了改变,应该使用OPTIMZE TABLE。删除的记录以一个链接表维持并且随后的INSERT操作再次使用老记录的位置。你可以使用OPTIMIZE TABLE回收闲置的空间。

OPTIMIZE TABLE通过制作原来的表的一个临时副本来工作。老的表子被拷贝到新表中(没有闲置的行),然后原来的表被删除并且重命名一个新的。这样做使得所有更新自动转向新的表,没有任何失败的更新。当时OPTIMIZE TABLE正在执行时,原来的表可被另外的客户读取。对表的更新和写入延迟到新表是准备好为止。
vivanboy 2002-08-29
  • 打赏
  • 举报
回复
我说的意思是在这种情况下没有用处
_Shakespeare 2002-08-29
  • 打赏
  • 举报
回复
有的,我是在phpmyadmin中使用的---不过一开始不知道为什么不能用,后来
进入phpMyAdmin 2.2.6然后就可以了
vivanboy 2002-08-29
  • 打赏
  • 举报
回复
OPTIMIZE 没用
_Shakespeare 2002-08-29
  • 打赏
  • 举报
回复
OPTIMIZE TABLE tablename
vivanboy 2002-08-29
  • 打赏
  • 举报
回复
$result=mysql_query("select id,key1,key2 from table");//key1,key2不让相同的字段名称
$array=array();
while($arr=mysql_fetch_array($result)){
$tmpArr=array_unique($arr);
array_shift($tmpArr);
if(in_array($tmpArr,$array)){
mysql_query("delete from table where id=".$arr[id]);
}else{
$array[]=$tmpArr;
}
}
xizi2002 2002-08-29
  • 打赏
  • 举报
回复
最原始的方法:
遍历所有的记录,依次比较第i和第i+1条(除了id)所有的字段,如果全相等就del it.
再难点的,叫楼上的高手给你回答吧,
vivanboy 2002-08-29
  • 打赏
  • 举报
回复
上面都不是答案
anziqi 2002-08-29
  • 打赏
  • 举报
回复
头一条语句可以产生一个无重复的表.
然后删除原有表中的记录.
把重复的表中的记录插入.
删除无重复表.
完成.

看看成不成.
felio 2002-08-29
  • 打赏
  • 举报
回复
pchome:

应该是用 distinct 这个参数来过滤重复的信息吧
用insert和select 结合的方式把相异的记录插入一个新表中
在删除旧表就可以了
anziqi 2002-08-29
  • 打赏
  • 举报
回复
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
andyzsy 2002-08-29
  • 打赏
  • 举报
回复
对不起,忘记说一点了,我的mysql数据表的信息,只有一点不一样,就是每条的id不一样,

请问我该怎么删除重复的记录,

谢谢

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧