今天玩sql语句的时候遇到了这么一个问题:
如何在同一张表中查找出一个字段内相同的数据.是这么说的吧- -具体的怎么写呢- -hhh
作为一个小白我做出了这样的判断,通过分组查询出这个字段大于1的是个啥
eg:
group by count(xxxx)>1
再从表中查询这个字段完成了此次操作
select xxxx from 表 GROUP BY xxxx HAVING COUNT(xxxx)>1
果然出来了- - hhh 然后删除重复的为了精准删除一个一条而不是删除两条数据我找到了另一条数据姑且称之为 lowId吧.我找到不是比较小的数据干掉他
select * from 表 where xxxx in
select xxxx from 表 GROUP BY xxxx HAVING COUNT(xxxx)>1)
and
lowIdNOT IN
(select min(lowId) from 表 GROUP BY xxxx HAVING COUNT(xxxx)>1)
在进行了为期5分钟的查询后- -(数据量有点大 有个十几万吧) 我去看看了索引- - 哇真香(此地不介绍- - )
锁定了5条数据 然后就是愉快的删除操作了
delete from 表 where xxxx in
select xxxx from 表 GROUP BY xxxx HAVING COUNT(xxxx)>1)
and
lowIdNOT IN
(select min(lowId) from 表 GROUP BY xxxx HAVING COUNT(xxxx)>1)
换一个标识搞定- - 没想到- - hhh
[Err] 1093 - You can't specify target table 'mara' for update in FROM clause
查了一下有道 //不能在FROM子句中为update指定目标表'mara'
????子句不能修改???? 好吧 那我给个名字试试 让他们玩 结果hhh 语法都不对了 好吧事到如今- -baidu...
人家说的就是:
原因在于sql语句中不能同时在查询一张表的同时进行修改或者删除这张表的操作 需要在查询的时候做一次缓存操作(不能变色么- - 算了第一天用今后再说)
缓存??哦哦哦 不懂 再去看看- -
delete from 表 where xxxx in
(select * from (select xxxx from 表 GROUP BY xxxx HAVING COUNT(xxxx)>1)as a)
哦!查询出来的数据作为a表 在查询一遍这就叫缓存了?? 改过之后 行吧- - 试试 hhh 在进行了长达3.2s的体验后
删了十条...重新导吧 我们再来一次- - 幸亏留下了备份的东西 要不哭去吧- -
delete from 表 where xxxx in
(select * from (select xxxx from 表 GROUP BY xxxx HAVING COUNT(xxxx)>1)as a)
and
lowId NOT IN
(select * from (select min(lowId) from 表 GROUP BY xxxx HAVING COUNT(xxxx )>1)as a)
最后成功了 嘿嘿 5条 希望给之后还在玩这个的自己几个忠告
1.备份很重要不要轻视 要不删除就gundan- -
2.在没有把握的情况下尽情尝试先 - -如果错了,重新来过就好
3.自己想完实在不会再baidu - - 晚安1120..xb