2017-04-08 121 views
0

我有成千上万的记录(包括重复的帖子),所以现在我想根据日期删除旧记录(只留下最新记录)。MySQL删除较旧的记录

我的代码下面给出

DELETE a.* 
FROM dle_post AS a 
    INNER JOIN (
     SELECT title, MIN(id) AS min_id 
     FROM dle_post 
     GROUP BY title 
     HAVING COUNT(*) > 1 
    ) AS b ON b.title = a.title 
AND b.min_id <> a.id 

的问题是ID,它随机记录的基础。我非常感谢你的帮助!

+2

我认为最新版本后都会有最大的ID,所以你应该使用最小的最大insteas来选择其ID将被保存 –

+0

@StefanoZanini谢谢你,它的工作就像一个魅力。 –

回答

1

如果你想以日期为基础,你应该在子查询中使用MAX(date)

DELETE a.* 
FROM dle_post AS a 
    INNER JOIN (
     SELECT title, MAX(date) AS maxdate 
     FROM dle_post 
     GROUP BY title 
     HAVING COUNT(*) > 1 
    ) AS b 
ON b.title = a.title 
AND a.date < b.maxdate 
+0

非常感谢。 –

-1

刚刚创建SELECT查询要删除的帖子,并把和子查询中:

DELETE FROM dle_post WHERE id IN (SELECT id FROM dle_post WHERE ...) 

这是更具可读性和可维护性。

+0

这将得到一个错误。请参阅http://stackoverflow.com/questions/45494/mysql-error-1093-cant-specify-target-table-for-update-in-from-clause – Barmar

+0

好的。我一直在使用PostgreSQL很多,我认为我可以在那里做到这一点。我今天学到了东西。 –

+0

另外,它应该是'NOT IN',因为他想删除每个组中最新的记录。 – Barmar