Solved

Deleting records by timestamp

Posted on 2009-04-11
6
338 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
Backup Your Microsoft Windows Server®

Backup all your Microsoft Windows Server – on-premises, in remote locations, in private and hybrid clouds. Your entire Windows Server will be backed up in one easy step with patented, block-level disk imaging. We achieve RTOs (recovery time objectives) as low as 15 seconds.

 
LVL 40

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 500 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

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

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

PL/SQL can be a very powerful tool for working directly with database tables. Being able to loop will allow you to perform more complex operations, but can be a little tricky to write correctly. This article will provide examples of basic loops alon…
Composite queries are used to retrieve the results from joining multiple queries after applying any filters. UNION, INTERSECT, MINUS, and UNION ALL are some of the operators used to get certain desired results.​
This tutorial demonstrates a quick way of adding group price to multiple Magento products.
A short film showing how OnPage and Connectwise integration works.

919 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

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now