sql语句group by 问题

首先,抛出问题,在工作中,有这么一个需求,找出某一个字段相同的记录数,然后将这些记录数删除。

我想到的第一个就是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子句,查找出来的结果将是整表的记录。

    原文作者:卡萨布兰卡ginger
    原文地址: https://www.jianshu.com/p/7df410f892cf
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞