首先,拋出問題硝清,在工作中辅斟,有這么一個需求,找出某一個字段相同的記錄數(shù)芦拿,然后將這些記錄數(shù)刪除士飒。
我想到的第一個就是group by關鍵字查邢,根據(jù)字段分組,就能找到相同的記錄酵幕。此時的sql語句是這樣的:
select id from table group by XXX order by id asc扰藕;
非常貼心的取id先創(chuàng)建的,這條sql找出來確實是去重過的記錄芳撒。
第二條sql我是這么寫的:
select * from table where id not in (select id from table group by XXX order by id asc);
這么看起來沒毛病邓深,之前的sql找出了200條記錄,數(shù)據(jù)庫一共有250條記錄笔刹,按道理說的是第二條sql還剩下50條記錄芥备。但是這句sql的結果集是空的,一條數(shù)據(jù)也沒有舌菜。
那么萌壳,這是為什么呢?我在這篇博客中日月,找到了一些解釋:[mysql ORDER BY,GROUP BY 和DISTINCT原理
這里面提到袱瓮,如果沒有where子句,mysql會全表查詢山孔,將查詢出來的結果進行group by排序分組懂讯,order by排序。也就是說mysql在沒有where語句的情況下台颠,找出來的結果集是整張表褐望!而不是最終排序分組的展示出來的結果集。(至于展示出來的效果串前,我想應該mysql優(yōu)化的結果吧~)所以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子句坛吁,查找出來的結果將是整表的記錄劳殖。