DELETE FROM member_logins
WHERE id in(
SELECT ID
FROM (SELECT
ID,member_id,
IF( @prev <> member_id, @rownum := 1, @rownum := @rownum+1 ) AS rank,
@prev := member_id,date_created
FROM member_logins t
JOIN (SELECT @rownum := NULL, @prev := 0) AS r
ORDER BY t.member_id,t.date_created desc) as tmp
where tmp.rank > 2)
Fixed the query. Tested on sample data and it works for me.
Sample Data i loaded for testing
id member_id date_created
1 1 2/26/2011 12:00:00 AM
2 1 5/26/2011 12:00:00 AM
3 1 4/26/2011 12:00:00 AM
4 2 5/26/2011 12:00:00 AM
5 2 3/26/2011 12:00:00 AM
6 2 4/26/2011 12:00:00 AM
Instead of 50, i have in the query top 2 rows for testing.
So my query should delete all rows which are having rank > 2 in each member_id group where in rows ordered by date_created desc.
Output after running the delete query:
id member_id date_created
2 1 5/26/2011 12:00:00 AM
3 1 4/26/2011 12:00:00 AM
4 2 5/26/2011 12:00:00 AM
6 2 4/26/2011 12:00:00 AM
You can see the rows with ID 1 and 5 got deleted. These are the rows having rank > 2 in each member_id group