58

This is probably an easy one... how can I achieve what i want with this query:

delete from posts where id not in
(SELECT id FROM posts order by timestamp desc limit 0, 15)

so, to put it in a nutshell, I want to delete every post that isn't on the latest 15.

When I try that query, I get that

MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery

EDIT

mySQL Server version: 5.5.8
mySQL Client version: mysqlnd 5.0.7-dev - 091210 - $Revision: 304625 $

Error: #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

DineshDB
  • 5,998
  • 7
  • 33
  • 49
André Alçada Padez
  • 10,987
  • 24
  • 67
  • 120

3 Answers3

170

Try this:

DELETE 
FROM posts 
WHERE id not in (
      SELECT * FROM (
            SELECT id 
            FROM posts 
            ORDER BY timestamp desc limit 0, 15
      ) 
      as t);
Daniel Fath
  • 16,453
  • 7
  • 47
  • 82
Nicola Cossu
  • 54,599
  • 15
  • 92
  • 98
10

You can try this:

DELETE 
    p1.* 
FROM 
    posts p1 INNER JOIN 
    (SELECT 
            id 
    FROM 
            posts 
            ORDER BY timestamp DESC 
            LIMIT 0, 15
    ) AS p2 
ON p1.id = p2.id;
Ertugrul Yilmaz
  • 103
  • 2
  • 4
2

Since the newest 15 will always come from the first 15 if you order them by descending order.You can just delete any id that did not make it into the first 15. like so i just tried it and it worked fine. Hopefully it helps someone

Delete from `table` where id not in (SELECT * FROM (Select id from `table` order by id desc limit 15) as derivedTable);
  • That's basically the same the first answer proposed; circumventing the limitation by doing two (nested) subqueries. Also, sorting by id instead of timestamp is not reliable, as older entries with a lower id might get a newer timestamp for various reasons. – Dennis98 Mar 14 '22 at 15:59