很久之前我写入一张sql的数据表,它里面有很多重复的内容。然后我想只保留一条原始数据:
例如上面的时间,出现了很多重复值。
我最初用的是这种方法:
SELECT * FROM table_name WHERE primary_key IN (
SELECT max(primary_key)
FROM table_name
GROUP BY noticeTime
HAVING COUNT(*) > 1
);
我们看看最里面的语句部分:
SELECT min(primary_key ) FROM table_name GROUP BY noticeTime HAVING COUNT(*) > 1
这个部分使用查询使用 GROUP BY
对表数据来分组数据,并使用HAVING
子句来选择那些title出现次数大于1的行,选出最小的id值出来(因为我是要最原始的时间的内容,id是递增的,所以选最小值,如果是要最新数据的话,则用max)
然后SELECT * FROM table_name WHERE primary_key IN (
这部分是选出符合不重复这个条件的id。
按理来说,我们是要保留这些id, 要删除 除去这部分id的其他值。
查询not in 是没有问题的,但是一旦对原表进行删减,如 DELETE FROM table_name WHERE primary_key NOT IN (
,就会出现下面这个警告:
1093 - You can’t specify target table 'table_name ’ for update in FROM clause
这个错误的是,我在同一个查询中要更新一个表,但同时又在FROM子句中直接引用这个表。又要查,又要改,就会导致锁表和性能问题。
所以直接建一个新表就好了:
CREATE new_table
SELECT * FROM table_name WHERE primary_key IN (
SELECT max(primary_key)
FROM table_name
GROUP BY noticeTime
HAVING COUNT(*) > 1
);