首先,抛出问题,在工作中,有这么一个需求,找出某一个字段相同的记录数,然后将这些记录数删除。
我想到的第一个就是group by关键字,根据字段分组,就能找到相同的记录。此时的sql语句是这样的:
select id from table group by XXX order by id asc;
非常贴心的取id先创建的,这条sql找出来确实是去重过的记录。
第二条sql我是这么写的:
select * from table where id not in (select id from table group by XXX order by id asc);
这么看起来没毛病,之前的sql找出了200条记录,数据库一共有250条记录,按道理说的是第二条sql还剩下50条记录。但是这句sql的结果集是空的,一条数据也没有。
那么,这是为什么呢?我在这篇博客中,找到了一些解释:[mysql ORDER BY,GROUP BY 和DISTINCT原理
这里面提到,如果没有where子句,mysql会全表查询,将查询出来的结果进行group by排序分组,order by排序。也就是说mysql在没有where语句的情况下,找出来的结果集是整张表!而不是最终排序分组的展示出来的结果集。(至于展示出来的效果,我想应该mysql优化的结果吧~)所以NOT IN的时候没有结果,因为查出来250条记录。
改进后的sql语句:
select * from table where id not in ( select * from (select id from table group by XXX order by id asc ) as tmp);
把展示后的200条记录存成一张表,然后从这200条记录中找剩下的50条记录~,可行!故原因应该由上面所示没有where子句,查找出来的结果将是整表的记录。