Solved

Deleting records by timestamp

Posted on 2009-04-11
6
340 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
Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

 
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

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

'Between' is such a common word we rarely think about it but in SQL it has a very specific definition we should be aware of. While most database vendors will have their own unique phrases to describe it (see references at end) the concept in common …
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.​
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

840 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