求一mysql语句,去掉数据库里某个字段相同记录,只保留一个。

radacct 表里 AcctSessionid 有相同记录,删除多余的保留唯一就可以了。

select distinct(字段名) from 表名追问

这个是找出相同的吧?

只保留一个,删除多余的应该怎么弄呢?

追答

你是要直接删除的语句吗?

追问

是的,求一个直接删除多余的相同记录语句。

radacct 表里 AcctSessionid 有相同记录,删除多余的保留唯一就可以了。

追答

delete from AcctSessionid where id not in (select min(id) from AcctSessionid group by 相同的字段名)
你得试一下 我没有验证过

追问

试过了select min(id) from AcctSessionid 这句话只能查到一个记录,但还不是我想删除的。

追答

这个当然只返回一条了 你得加上后面的Group by啊 group by过滤的就是你那个相同值的字段啊

追问

select min(AcctSessionid) from radacct where acctstoptime='0000-00-00 00:00:00' group by AcctSessionid
这样是可以排除重复记录了但是
delete from AccSessionid where id not in ()套在外面运行就报错了
[Err] 1093 - You can't specify target table 'radacct' for update in FROM clause

追答

delete from radacct where id not in(select min(AcctSessionid) from radacct where acctstoptime='0000-00-00 00:00:00' group by AcctSessionid
)

追问

[SQL] delete from radacct where AcctSessionid not in(select min(AcctSessionid) from radacct where acctstoptime='0000-00-00 00:00:00' group by AcctSessionid)

[Err] 1093 - You can't specify target table 'radacct' for update in FROM clause

追答

http://zhidao.baidu.com/question/68619324.html
原来MySQL不支持这么用。你看下这个,估计你得建临时表的方式来处理了

追问

本人菜鸟一个,能否给出详细语句。

追答

创建一个结构跟你要处理的表结构一样的临时表,将全部数据copy到那个临时表,然后语句这样写:
delete from radacct where AcctSessionid not in(select min(AcctSessionid) from 临时表名where acctstoptime='0000-00-00 00:00:00' group by AcctSessionid)

追问

insert into temp select * from radacct where acctstoptime='0000-00-00 00:00:00' order by nasipaddress desc;

delete from radacct where AcctSessionid not in(select min(AcctSessionid) from temp where acctstoptime='0000-00-00 00:00:00' group by AcctSessionid);
影响的数据栏: 31602
时间: 18.937ms

这句话删了我3W多条记录啊,我只要删重复的。

追答

那是要删什么重复的?就把那个字段放到gourp by后面

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-21
用gorup by 你的字段
第2个回答  2011-09-21
你举个简单例子吧,这样别人容易懂你的问题,问题应该不难追问

radacct 表里 AcctSessionid字段 有相同记录,删除多余的保留唯一就可以了。

追答

需要另外一个字段,最好是AcctSessionid对应的唯一的,这样才好处理
类似id

delete from radacct t1
where id (select min(id) from radacct where AcctSessionid = t1.AcctSessionid)

追问

有没有更简单些的方法,或者函数。尽量不动结构。

追答

如果没有这样一个字段,mysql没有办法拿到行号,很难

相似回答