?
Solved

Deleting records by timestamp

Posted on 2009-04-11
6
Medium Priority
?
345 Views
Last Modified: 2012-05-06
Hi,

I have a table which looks like:

    id          |    name   |   date_created
   ----------------------------------------------
   varchar     varchar      TIMESTAMP


I want to delete the oldest N records from the above table so I end up with max 50 records in the table. For example, if the table has 1000 records, I'd like to delete the oldest 950 records. How can I do this? I guess I need to sort the records by timestamp, then find the 50th record, record its timestamp value, then delete all records with a timestamp 'greater' than that...any info would be great,

Thanks
0
Comment
Question by:DJ_AM_Juicebox
6 Comments
 
LVL 9

Expert Comment

by:LinuxNubb
ID: 24123248
If you know exactly how many records you have, you could add a 'LIMIT 950' onto the end of the delete query.

Maybe:

DELETE FROM table ORDER BY date_created DESC LIMIT (SELECT COUNT(id) FROM table - 50)

?

Worth a test.  TEST would be the key!
0
 
LVL 57

Expert Comment

by:Raja Jegan R
ID: 24123336
This will solve you out:

DELETE FROM table
WHERE id IN
( SELECT t1.id FROM table t1 LEFT OUTER JOIN (SELECT id FROM table ORDER BY date_created DESC LIMIT 50) t2 ON t1.id = t2.id where t2.id is null)
0
 
LVL 14

Expert Comment

by:racek
ID: 24123477
DELETE FROM your_table
WHERE id  NOT IN
( SELECT id,date_created
    FROM your_table
    ORDER BY date_created DESC LIMIT 50);
0
NEW Veeam Agent for Microsoft Windows

Backup and recover physical and cloud-based servers and workstations, as well as endpoint devices that belong to remote users. Avoid downtime and data loss quickly and easily for Windows-based physical or public cloud-based workloads!

 
LVL 41

Expert Comment

by:Sharath
ID: 24123536
The date_created column should not be present in the SELECT clause in racek post. corrected that.
DELETE FROM your_table
WHERE id  NOT IN
( SELECT id
    FROM your_table 
    ORDER BY date_created DESC LIMIT 50);

Open in new window

0
 
LVL 14

Expert Comment

by:racek
ID: 24124810
sorry LIMIT is forbidden in subqueries :-)
CREATE TABLE del_rows 
SELECT id FROM your_table ORDER BY date_created DESC LIMIT 50
 
DELETE FROM your_table
WHERE id  NOT IN
( SELECT id
    FROM del_rows 
    ORDER BY date_created DESC LIMIT 50);
 
DROP table del_rows;

Open in new window

0
 
LVL 14

Accepted Solution

by:
racek earned 2000 total points
ID: 24124814
oops too much copy & paste :-)
CREATE TABLE del_rows 
SELECT id FROM your_table ORDER BY date_created DESC LIMIT 50
 
DELETE FROM your_table
WHERE id  NOT IN (SELECT id  FROM del_rows);
 
DROP table del_rows;

Open in new window

0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

One of the most important things in an application is the query performance. This article intends to give you good tips to improve the performance of your queries.
MSSQL DB-maintenance also needs implementation of multiple activities. However, unprecedented errors can hamper the database management. In that case, deploying Stellar SQL Database Toolkit ensures fast and accurate database and backup repair as wel…
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infras…
With just a little bit of  SQL and VBA, many doors open to cool things like synchronize a list box to display data relevant to other information on a form.  If you have never written code or looked at an SQL statement before, no problem! ...  give i…
Suggested Courses

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question