2013-06-26 110 views
0

我试图保留最近的10个条目,并删除旧的条目。我试过DELETE FROM people ORDER BY id DESC LIMIT $excess,但它只是删除了前10名的条目。删除旧的数据库条目

$query = "SELECT * FROM people"; 
$result = mysqli_query($conn, $query); 
$count = mysqli_num_rows($result); 
if ($count > 10) { 
    $excess = $count - 10; 
    $query = "DELETE FROM people WHERE id IN(SELECT id FROM people ORDER BY id DESC LIMIT '$excess')"; 
    mysqli_query($conn, $query); 
} 
+3

http://stackoverflow.com/questions/578867/sql-query-delete-all-records-from-the-table-除了 - latest-n – user20232359723568423357842364

+0

+1,为获胜的子查询。 – PlantTheIdea

+2

你真的需要删除它们吗? – andrewsi

回答

2

您可以使用此: -

DELETE FROM `people` 
WHERE id NOT IN (
    SELECT id 
    FROM (
    SELECT id 
    FROM `people` 
    ORDER BY id DESC 
    LIMIT 10 
) 
); 

而且您的查询在逻辑上是不正确的,你按降序提取的记录。即Latest to older,您将删除最近的记录。改为使用ASC

+0

我不得不在第一个评论的链接建议的第一个“)”后添加一个别名,但它似乎工作。谢谢。 –

-1

也许找到第10个元素的ID,然后删除所有较旧的行?

2

像这样的东西?获取子查询中的十个最新ID,然后删除所有其他ID。

DELETE FROM people WHERE id NOT IN (SELECT id FROM PEOPLE ORDER BY id DESC LIMIT 10) 
+0

我得到#1235 - 这个版本的MySQL还不支持'LIMIT&IN/ALL/ANY/SOME subquery'版本。 5.0.91 –

+0

噢,那么你使用的是旧版本的MySQL。如果你不能更新,我会建议做两个查询 - 一个找到第十个ID,然后用它来删除所有具有较旧ID的查询。 –

0

你的逻辑是所有的地方,[你应该ORDER BY ASC,不DESC]和您的查询将采取的年龄,如果有[例如] 10000个条目,因为你有一个IN子句9,990项比较全部10000个至。

选择最近10个,并删除其中不在家。

DELETE FROM people 
    WHERE id NOT IN(
    SELECT id 
    FROM people 
    ORDER BY id DESC 
    LIMIT 10 
)